python3 序列切片

2022-03-06 18:13:03 字數 4509 閱讀 9540

格式:[::]切片使用兩個冒號分隔的3個數字來完成。

第乙個數字表示切片開始位置(預設為0)。

第二個數字表示切片截止(但不包含)位置(預設為列表長度)。

第三個數字表示切片的步長(預設為1),當步長省略是可省略最後乙個冒號。

1.切片操作不會因為下標越界而丟擲異常,而是簡單地在列表尾部截斷或者返回乙個空列表。

>>> alist=[1,2,3,4,5,6,7,8,9,0,]

>>> alist[::]   #返回包含元素的新列表

[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

>>> alist[::-1]  #逆序的所有元素

[0, 9, 8, 7, 6, 5, 4, 3, 2, 1]

>>> alist[::2]   #偶數字置,隔乙個取乙個

[1, 3, 5, 7, 9]

>>> alist[1::2]   #奇數字置,隔乙個取乙個

[2, 4, 6, 8, 0]

>>> alist[3::]    #從下標3開始的所有元素

[4, 5, 6, 7, 8, 9, 0]

>>> alist[3:6]    #下標在[3,6]之間的所有元素

[4, 5, 6]

>>> alist[0:100:1]  #前100個元素,自動截斷

[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

>>> a[100:]      #下標100之後的所有元素,自動截斷

>>> x[100]      #直接使用下標訪問會發生越界

traceback (most recent call last):

file "", line 1, in x[100]

indexerror: list index out of range

2.可以使用切片來原地修改列表內容

>>> alist

[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

>>> alist[len(alist):]=[9]    #在尾部追加元素

>>> alist

[1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 9]>>> alist[:3]=[3,2,1]      #替換前三個元素

>>> alist

[3, 2, 1, 4, 5, 6, 7, 8, 9, 0, 9]

>>> alist[:3]=         #刪除前三個元素

>>> alist

[4, 5, 6, 7, 8, 9, 0, 9]

>>> alist=list(range(10))

>>> alist

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> alist[::2]=[0]*5        #替換偶數字置上的元素

>>> alist

[0, 1, 0, 3, 0, 5, 0, 7, 0, 9]  

>>> alilst[::2]=[0]*3        #切片不連續,兩個元素個數必須一樣多

traceback (most recent call last):

file "", line 1, in alilst[::2]=[0]*3

nameerror: name 'alilst' is not defined

3.使用del與切片結合來刪除列表元素

>>> alist=[3,4,5,6,7,]

>>> del alist[:3]      #刪除前三個元素

>>> alist

[6, 7]

>>> alist=[3,4,5,6,7]  

>>> del alist[::2]    #刪除偶數字置上的元素

>>> alist

[4, 6]

4.切片返回的是列表元素的淺複製(淺複製是把原列表中所有元素的引用都複製都信列表中)

>>> alist=[3,5,7]

>>> blist=alist

>>> blist

[3, 5, 7]

>>> blist[1]= 8

>>> alist

[3, 8, 7]

>>> alist==blist

true

>>> alist is blist

true

>>> id(alist)

2848177707136

>>> id(blist)

2848177707136

5.淺複製是把原列表中所有元素的引用都複製都信列表中

原列表中只包含整數、實數、複數等基本型別或元組、字串這樣的不可變型別的資料,一般是沒有問題的。

原列表中包含列表之類的可變資料型別,由於淺複製是只是把子列表的引用複製到新列表中,修改任何乙個都會影響另外乙個。

>>> alist=[1,2,3]

>>> blist=alist[::]      #切片,淺複製

>>> alist==blist        #兩個列表的元素完全一樣

true

>>> alist is blist        #但不是同乙個物件

false

>>> id(alist)==id(blist)    #記憶體位址不一樣

false

>>> blist[1]=8          #修改乙個不會影響另乙個

>>> blist

[1, 8, 3]

>>> alist

[1, 2, 3]

後續補充內容:

切片的功能:從起始位置到結束位置的前乙個位置,按步長來提取資料並生成新的物件,並且不會改變原資料型別;

舉例1,都寫全:

l = [2,4,5,6,2,6,0,4]  #長度8

result = l[2:6:1]

print(result)

結果:[5,6,2,6]

可以看出,按步長1,從索引2開始,到索引6-1結束的所有元素

備註:以上的這些操作也同樣適用於字串或者元組中,對字串進行反向顯示,使用切片可以非常方便的做到;

舉例2,省略步長:

l = [2,4,5,6,2,6,0,4]  #長度8

result = l[2:6]

print(result)

結果:[5,6,2,6]

可以看出,步長預設為1,可省略

舉例3,開始索引省略:

l = [2,4,5,6,2,6,0,4]  #長度8

result = l[:5]

print(result)

結果:[2,4,5,6,2]

可以看出,按步長1,從第乙個元素開始,到索引5-1結束的所有元素

舉例4,結束索引省略:

l = [2,4,5,6,2,6,0,4]  #長度8

result = l[3:]

print(result)

結果:[6,2,6,0,4]

可以看出,按步長1,從索引3元素開始,到最後乙個元素

舉例5,開始、結束索引都省略:

l = [2,4,5,6,2,6,0,4]  #長度8

result = l[:]

print(result)

結果:[2,4,5,6,2,6,0,4]

可以看出,相當於從第乙個到最後乙個元素,複製了乙個新的序列

舉例6,步長非1但為正整數:

l = [2,4,5,6,2,6,0,4]  #長度8

result = l[2:6:2]

print(result)

結果:[5,2]

可以看出,按步長2,從索引2元素開始,到到索引6-1元素結束的所有元素

舉例7,步長為負整數:

l = [2,4,5,6,2,6,0,4]  #長度8

result = l[-2:-7:-3]

print(result)

結果:[0,6]

可以看出,按步長2,從索引-2元素開始,到到索引-7+1元素結束的所有元素

備註:切片時一定要保證步和的方向與開始、結束的方向一致,否則可能會得到乙個空序列

舉例8,開始、結束省略,步長-1,可得到乙個反向的序列:

l = [2,4,5,6,2,6,0,4]  #長度8

result = l[::-1]

print(result)

結果:[4, 0, 6, 2, 6, 5, 4, 2]

可以看出,開始、結束索引都省略,可以得到乙個反向的序列

Python3 序列解包

自 序列解包是 python 3.0 之後才有的語法 什麼是序列解包呢?先看乙個例子 a,b,c 1,2,3 a 1 b 2 c 3 這種方法並不限於列表和元組,而是適用於任意序列型別 甚至包括字串和位元組序列 只要賦值運算子左邊的變數數目與序列中的元素數目相等,你都可以用這種方法將元素序列解包到另...

python3 切片 python3 切片

取乙個list或tuple的部分元素是非常常見的操作。比如,乙個list如下 l michael sarah tracy bob jack 取前3個元素,應該怎麼做?笨辦法 l 0 l 1 l 2 michael sarah tracy 之所以是笨辦法是因為擴充套件一下,取前n個元素就沒轍了。取前n...

python3 切片 七 python3 切片

切片 取乙個 list 或 tuple 的部分元素是非常常見的操作 l michael sarah tracy bob jack 笨辦法 之所以是笨辦法是因為擴充套件一下,取前 n 個元素就沒轍了。l 0 l 1 l 2 michael sarah tracy 取前 n 個元素,也就是索引為 0 n...