Python高階特性之切片

2021-07-16 14:20:38 字數 4124 閱讀 7457

切片操作符是序列名後跟乙個方括號,方括號中有一對可選的數字,並用冒號分割。注意這與你使用的索引操作符十分相似。記住數是可選的,而冒號是必須的。

切片操作符中的第乙個數(冒號之前)表示切片開始的位置,第二個數(冒號之後)表示切片到**結束,第三個數(冒號之後)表示切片間隔數。如果不指定第乙個數,python就從序列首開始。如果沒有指定第二個數,則python會停止在序列尾。注意,返回的序列從開始位置開始 ,剛好在 結束 位置之前結束。即開始位置是包含在序列切片中的,而結束位置被排斥在切片外。

這樣,shoplist[1:3]返回從位置1開始,包括位置2,但是停止在位置3的乙個序列切片,因此返回乙個含有兩個專案的切片。類似地,shoplist[:]返回整個序列的拷貝。shoplist[::3]返回位置3,位置6,位置9…的序列切片。

你可以用負數做切片。負數用在從序列尾開始計算的位置。例如,shoplist[:-1]會返回

除了最後乙個專案

外包含所有專案的序列切片,shoplist[::-1]會返回倒序序列切片。

使用python直譯器互動地嘗試不同切片指定組合,即在提示符下你能夠馬上看到結果。序列的神奇之處在於你可以用相同的方法訪問元組、列表和字串。

python中含有六種內建序列類:list, tuple, string, unicode, buffer, xrange。其中xrange比較特殊,它是乙個生成器,其他幾個型別具有的一些序列特性對它並不適合。

>>> a = 'iloveyou' 

>>> len(a)

8 >>> max(a)

'y'

>>> min(a)

'i'

>>> bool('o' in a)

true

>>> a + a

'iloveyouiloveyou'

>>> a*3

'iloveyouiloveyouiloveyou'

>>> a[1:4]

'lov'

>>> a.index('y')

5 >>> a[5]

'y'

一般說來,具有序列結構的資料型別都可以使用:index, len, max, min, in, +, *, 切片。如:

切片操作

對於具有序列結構的資料來說,切片操作的方法是:consequence[start_index: end_index: step]。

start_index:表示是第乙個元素物件,正索引位置預設為0;負索引位置預設為 -len(consequence)

end_index:表示是最後乙個元素物件,正索引位置預設為 len(consequence)-1;負索引位置預設為 -1。

step:表示取值的步長,預設為1,步長值不能為0。

[注意]對於序列結構資料來說,索引和步長都具有正負兩個值,分別表示左右兩個方向取值。索引的正方向從左往右取值,起始位置為0;負方向從右往左取值,起始位置為-1。因此任意乙個序列結構資料的索引範圍為 -len(consequence) 到 len(consequence)-1 範圍內的連續整數。

切片操作會將按照給定的索引和步長,擷取序列中由連續的物件組成的片段,單個索引返回值可以視為只含有乙個物件的連續片段。

切片的過程是從第乙個想要的物件開始,到第乙個不想要的物件結束。第乙個想要的物件到第乙個不想要的物件之間的連續物件就是你所有想要的物件。

因此在consequence[start_index: end_index]中,切片中包含了consequence[start_index],但不包括consequence[end_index]。

切片的操作型別:

con[start_index]:返回索引值為start_index的物件。start_index為 -len(con)到len(con)-1之間任意整數。

con[start_index: end_index]:返回索引值為start_index到end_index-1之間的連續物件。

con[start_index: end_index : step]:返回索引值為start_index到end_index-1之間,並且索引值與start_index之差可以被step整除的連續物件。

con[start_index: ]:預設end_index,表示從start_index開始到序列中最後乙個物件。

con[: end_index]:預設start_index,表示從序列中第乙個物件到end_index-1之間的片段。

con[:]:預設start_index和end_index,表示從第乙個物件到最後乙個物件的完整片段。

con[::step]:預設start_index和end_index,表示對整個序列按照索引可以被step整除的規則取值。

在使用單索引對序列定址取值時,你所輸入的索引值必須是處於 -len(consequence) 到 len(consequence)-1 之間的值,否則會報錯提示索引值超出範圍。如:

>>> a=[1,2,3,4,5,6,7] 

>>> a[len(a)-1]

7 >>> a[-len(a)]

1 >>> a[len(a)]

traceback (most recent call last):

file "", line 1, in a[len(a)]

indexerror: list index out of range

>>> a[-len(a)-1]

traceback (most recent call last):

file "", line 1, in a[-len(a)-1]

indexerror: list index out of range

其中a[len(a)-1]等同於a[-1],a[-len(a)]等同於a[0],分別表示序列的最後乙個和第乙個物件。

當使用冒號(:)對序列進行切片取值時,你所輸入的無論是start_index或者end_index,都不必侷限於 -len(a) 和 len(a)-1 之間,因為只有當你輸入的索引號處於這個區間時才真正有效,而當你輸入的索引號超出這個範圍時,python會自動將start_index或end_index設定為預設值(即第乙個物件和最後乙個物件)。如:

>>> a[-100:100] 

[1, 2, 3, 4, 5, 6, 7]

[注意]一定要記住,end_index其實是你第乙個不想要獲取的物件的索引,所以a[0:-1]是取不到a[-1]的,所以如果要使得切片片段包含end_index位置的物件,請預設end_index,或者輸入乙個超出end_index範圍的值。

利用步長對序列進行倒序取值

在切片運算中,步長為正,表示從左至右,按照索引值與起始位置索引之差可以被步長整除的規律取值;當步長為負,則表示從右至左,按照按照索引值與起始位置索引之差可以被步長整除的規律取值。

根據這個特性,我們可以很方便對某個序列進行倒序取值,這個方法比reverse方法更方便,且適用於沒有reverse方法的字串和元組。

>>> a=[1,2,3,4,5,6,7] 

>>> b=(1,2,3,4,5,6,7)

>>> c='let me show you a little thing'

>>> a[::-1]

[7, 6, 5, 4, 3, 2, 1]

>>> b[::-1]

(7, 6, 5, 4, 3, 2, 1)

>>> c[::-1]

'gniht elttil a uoy wohs em tel'

>>> a

[1, 2, 3, 4, 5, 6, 7]

>>> b

(1, 2, 3, 4, 5, 6, 7)

>>> c

'let me show you a little thing'

>>> a.reverse()

>>> a

[7, 6, 5, 4, 3, 2, 1]

相對reverse而言,切片的方法不會改變列表的結構,所以這是在實際應用中比較有用的乙個技巧。

參考[1]

[2]

Python高階特性之切片

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

Python 高階特性 切片

在list,string 中取部分元素的操作是十分常見的 如下list list 1,2,qwe 3,asd list 1,2,qwe 3,asd 想要取中間三個元素,要怎麼做?笨方法 1 直接利用索引取值 list 1 list 2 list 3 2,qwe 3 如果有100個元素或者1000元素...

Python高階特性 切片 Slice

如何在乙個陣列中取特定的一組資料?是乙個個指定?l range 10 l 0,1,2,3,4,5,6,7,8,9 l 0 0 l 1 l 2 l 3 1,2,3 資料少還行,要是資料多呢?迴圈怎麼樣?l range 10 l 0,1,2,3,4,5,6,7,8,9 for i in range 3 ...