通過指定下標的方式來獲得某一個數據元素,或者通過指定下標範圍來獲得一組序列的元素,這種訪問序列的方式叫做切片。有些地方也把它稱之為分片。 關於切片的工作方式,可以參考我之前寫的文章:Python中切片的工作原理 先從底層分析切片運算:list的切片,內部是調用__getitem__,__setite ...
通過指定下標的方式來獲得某一個數據元素,或者通過指定下標範圍來獲得一組序列的元素,這種訪問序列的方式叫做切片。有些地方也把它稱之為分片。
關於切片的工作方式,可以參考我之前寫的文章:Python中切片的工作原理
先從底層分析切片運算:
list的切片,內部是調用__getitem__,__setitem__,__delitem__和slice函數。而slice函數又是和range()函數相關的。
給切片傳遞的鍵是一個特殊的slice對象。該對象擁有可描述所請求切片方位的屬性,
例如:
a = [1,2,3,4,5,6] x = a [ 1 : 5 ] # x = a.__getitem__(slice( 1, 5, None)) a [ 1 : 3 ] = [10, 11, 12 ] # a.__setitem__(slice(1, 3, None), [ 10, 11, 12 ]) del a [ 1 : 4 ] # a.__delitem__(slice(1, 4, None))
切片操作的方法:con[start_index:end_index:step]
start_index:表示是第一個元素對象,正索引位置預設為0;負索引位置預設為 -len(con)
end_index: 表示是最後一個元素對象,正索引位置預設為 len(con)-1;負索引位置預設為-1。
step: 表示取值的步長,預設為1,步長值不能為0。
對於序列來說,索引和步長都具有正負兩個值,分別表示左右兩個方向取值。索引的正方向從左往右取值,起始位置為0;負方向從右往左取值,起始位置為-1。
因此任意一個序列結構數據的索引範圍為-len(con)到len(con)-1範圍內的連續整數。
切片的操作類型:
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整除的規則取值。
切片的用法:
#1.step取值相關案例 >>> lst = range(10) >>> lst [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] #案例1 >>> lst[::1] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> lst[0:len(lst)] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> lst [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> lst[-len(lst):-1].append(lst[9]) >>> lst [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] #案例2 >>> lst[::-1] [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] >>> lst[-1:-10:-1] [9, 8, 7, 6, 5, 4, 3, 2, 1] #案例3 >>> lst[-1:1] [] >>> lst[-1:1:1] [] lst[-1:1]等價於lst[-1:1:1],由於最後一個元素後面找不到index為1的,故返回為空。 #案例4 >>> lst[-1:1:-1] [9, 8, 7, 6, 5, 4, 3, 2] 從下標為-1的元素開始,以反方向切片找到到index為1的元素(即2)。 等價於:lst[-1:-len(lst)+1:-1] >>> lst[-1:-9:-1] [9, 8, 7, 6, 5, 4, 3, 2] #2.start_index和end_index取值相關案例 >>> lst = [1,2,3,4,5,6] #lst上界為0,下界為6 >>> lst[-10:10] #-10超出了上界,10超出了下界,等價於lst[0:6],返回[1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6] >>> lst[-10:-20] #-10和-20均超出了上界,自動取上界,等價於lst[0:0],返回[] [] >>> lst[10:20] #10和20均超出了下界,自動取下界,等價於lst[6:6],返回[] [] >>> lst[:100] #start預設:表示從第0個開始,返回[1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6] >>> lst[0:] #end預設:表示從start位置取到結尾,返回[1, 2, 3, 4, 5, 6] [1, 2, 3, 4, 5, 6] #3.start_index:end_index:step綜合案例 >>> lst = range(100) >>> lst[:10] #取前10個數 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> lst[-10:] #取後10個數 [90, 91, 92, 93, 94, 95, 96, 97, 98, 99] >>> lst[10:20] #取第11-20個數 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19] >>> lst[:20:2] #取前20個數,每隔2個取1個 [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] >>> lst[::5] #取所有數,每隔5個取1個 [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95] >>> lst[:] #什麼都不寫,表示按原樣複製list [0, 1, 2, 3, 4, 5, 6。。。, 98, 99] >>> lst[::] #什麼都不寫,表示按原樣複製list [0, 1, 2, 3, 4, 5, 6。。。, 98, 99] #利用range函數生成1-100的數,取3的倍數,並且取前十個 >>> [i for i in range(1,100)[2::3][:10]] [3, 6, 9, 12, 15, 18, 21, 24, 27, 30] #利用range函數生成1-100的數,取3的倍數,並且取最後十個 >>> [i for i in range(1,100)[2::3][-10:]] [72, 75, 78, 81, 84, 87, 90, 93, 96, 99] #從range(1,100)中取7的倍數 >>> [x for x in range(1,100)[6::7]] [7, 14, 21, 28, 35, 42, 49, 56, 63, 70, 77, 84, 91, 98]
相對reverse而言,切片的方法不會改變列表的結構,所以這是在實際應用中比較有用的一個技巧。
參考文獻:
徹底理解Python切片:https://www.cnblogs.com/weidiao/p/6428681.html
Python中切片的理解:http://blog.csdn.net/u011242657/article/details/56289429