歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Python序列的切片操作與技巧

Python序列的切片操作與技巧

日期:2017/3/1 9:55:39   编辑:Linux編程

序列

序列(consequence)是python中一種數據結構,這種數據結構根據索引來獲取序列中的對象。

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

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

>>> 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'

切片操作

對於具有序列結構的數據來說,切片操作的方法是: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 "<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],分別表示序列的最後一個和第一個對象。

當使用冒號(:)對序列進行切片取值時,你所輸入的無論是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而言,切片的方法不會改變列表的結構,所以這是在實際應用中比較有用的一個技巧。

Copyright © Linux教程網 All Rights Reserved