Python序列的切片操作與技巧
Python中含有六種內(nèi)建序列類(lèi):list, tuple, string, unicode, buffer, xrange。其中xrange比較特殊,它是一個(gè)生成器,其他幾個(gè)類(lèi)型具有的一些序列特性對(duì)它并不適合。
- >>> 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'
一般說(shuō)來(lái),具有序列結(jié)構(gòu)的數(shù)據(jù)類(lèi)型都可以使用:index, len, max, min, in, +, *, 切片。如:
切片操作
對(duì)于具有序列結(jié)構(gòu)的數(shù)據(jù)來(lái)說(shuō),切片操作的方法是:consequence[start_index: end_index: step]。
start_index:表示是第一個(gè)元素對(duì)象,正索引位置默認(rèn)為0;負(fù)索引位置默認(rèn)為 -len(consequence)
end_index:表示是最后一個(gè)元素對(duì)象,正索引位置默認(rèn)為 len(consequence)-1;負(fù)索引位置默認(rèn)為 -1。
step:表示取值的步長(zhǎng),默認(rèn)為1,步長(zhǎng)值不能為0。
[注意]對(duì)于序列結(jié)構(gòu)數(shù)據(jù)來(lái)說(shuō),索引和步長(zhǎng)都具有正負(fù)兩個(gè)值,分別表示左右兩個(gè)方向取值。索引的正方向從左往右取值,起始位置為0;負(fù)方向從右往左取值,起始位置為-1。因此任意一個(gè)序列結(jié)構(gòu)數(shù)據(jù)的索引范圍為 -len(consequence) 到 len(consequence)-1 范圍內(nèi)的連續(xù)整數(shù)。
切片操作會(huì)將按照給定的索引和步長(zhǎng),截取序列中由連續(xù)的對(duì)象組成的片段,單個(gè)索引返回值可以視為只含有一個(gè)對(duì)象的連續(xù)片段。
切片的過(guò)程是從第一個(gè)想要的對(duì)象開(kāi)始,到第一個(gè)不想要的對(duì)象結(jié)束。第一個(gè)想要的對(duì)象到第一個(gè)不想要的對(duì)象之間的連續(xù)對(duì)象就是你所有想要的對(duì)象。
因此在consequence[start_index: end_index]中,切片中包含了consequence[start_index],但不包括consequence[end_index]。
切片的操作類(lèi)型:
con[start_index]:返回索引值為start_index的對(duì)象。start_index為 -len(con)到len(con)-1之間任意整數(shù)。
con[start_index: end_index]:返回索引值為start_index到end_index-1之間的連續(xù)對(duì)象。
con[start_index: end_index : step]:返回索引值為start_index到end_index-1之間,并且索引值與start_index之差可以被step整除的連續(xù)對(duì)象。
con[start_index: ]:缺省end_index,表示從start_index開(kāi)始到序列中最后一個(gè)對(duì)象。
con[: end_index]:缺省start_index,表示從序列中第一個(gè)對(duì)象到end_index-1之間的片段。
con[:]:缺省start_index和end_index,表示從第一個(gè)對(duì)象到最后一個(gè)對(duì)象的完整片段。
con[::step]:缺省start_index和end_index,表示對(duì)整個(gè)序列按照索引可以被step整除的規(guī)則取值。
在使用單索引對(duì)序列尋址取值時(shí),你所輸入的索引值必須是處于 -len(consequence) 到 len(consequence)-1 之間的值,否則會(huì)報(bào)錯(cuò)提示索引值超出范圍。如:
- >>> 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 "<pyshell#98>", line 1, in <module>
- a[len(a)]
- IndexError: list index out of range
- >>> a[-len(a)-1]
- Traceback (most recent call last):
- File "<pyshell#99>", line 1, in <module>
- a[-len(a)-1]
- IndexError: list index out of range
其中a[len(a)-1]等同于a[-1],a[-len(a)]等同于a[0],分別表示序列的最后一個(gè)和第一個(gè)對(duì)象。
當(dāng)使用冒號(hào)(:)對(duì)序列進(jìn)行切片取值時(shí),你所輸入的無(wú)論是start_index或者end_index,都不必局限于 -len(a) 和 len(a)-1 之間,因?yàn)橹挥挟?dāng)你輸入的索引號(hào)處于這個(gè)區(qū)間時(shí)才真正有效,而當(dāng)你輸入的索引號(hào)超出這個(gè)范圍時(shí),python會(huì)自動(dòng)將start_index或end_index設(shè)定為缺省值(即第一個(gè)對(duì)象和最后一個(gè)對(duì)象)。如:
- >>> a[-100:100]
- [1, 2, 3, 4, 5, 6, 7]
[注意]一定要記住,end_index其實(shí)是你第一個(gè)不想要獲取的對(duì)象的索引,所以a[0:-1]是取不到a[-1]的,所以如果要使得切片片段包含end_index位置的對(duì)象,請(qǐng)缺省end_index,或者輸入一個(gè)超出end_index范圍的值。
利用步長(zhǎng)對(duì)序列進(jìn)行倒序取值
在切片運(yùn)算中,步長(zhǎng)為正,表示從左至右,按照索引值與起始位置索引之差可以被步長(zhǎng)整除的規(guī)律取值;當(dāng)步長(zhǎng)為負(fù),則表示從右至左,按照按照索引值與起始位置索引之差可以被步長(zhǎng)整除的規(guī)律取值。
根據(jù)這個(gè)特性,我們可以很方便對(duì)某個(gè)序列進(jìn)行倒序取值,這個(gè)方法比reverse方法更方便,且適用于沒(méi)有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]
相對(duì)reverse而言,切片的方法不會(huì)改變列表的結(jié)構(gòu),所以這是在實(shí)際應(yīng)用中比較有用的一個(gè)技巧。
原文鏈接:http://www.cnblogs.com/ifantastic/archive/2013/04/15/3021845.html