在python學習開發的過程中,我們總是不斷的要對List(列表),Tuple(元組)有取值操作:假如我們有一個列表List1現在想取出1其中的前5個元素,改怎么操作呢?
1 >>> List1 = ['zhangxueyou','liuyifei','liudehua','huyidao','haodada','wumengda','zhouxingchi','chenglong','Jack','linzhilin'] 2 >>> List1 3 ['zhangxueyou', 'liuyifei', 'liudehua', 'huyidao', 'haodada', 'wumengda', 'zhouxingchi', 'chenglong', 'Jack', 'linzhilin'] 4 >>> #比較笨的辦法是直接取值 5 ... 6 >>> [List1[1],List1[2],List1[3],List1[4],List1[5]] 7 ['liuyifei', 'liudehua', 'huyidao', 'haodada', 'wumengda'] 8 >>>
以上的直接取值的方法是存在很大的局限性的,假如現在想取前一百萬個值的話,是不是就沒有辦法了呢?但是你還是可以用循環完成:
1 >>> List1 2 ['zhangxueyou', 'liuyifei', 'liudehua', 'huyidao', 'haodada', 'wumengda', 'zhouxingchi', 'chenglong', 'Jack', 'linzhilin'] 3 >>> List2 = [] 4 >>> List2 5 [] 6 >>> n = 5 7 >>> for i in range(n): 8 ... List2.append(List1[i]) 9 ... 10 >>> List2 11 ['zhangxueyou', 'liuyifei', 'liudehua', 'huyidao', 'haodada'] 12 >>>
但是,對這種經常取指定索引的范圍的操作,假如你使用循環的話使可以解決的,但是相對更好的方法而言,此操作是相當繁瑣和費事的。因此python就提供了一個比較重量級的方法:切片(Slice)操作,能大大的簡化操作。
對於同樣的問題,只需要簡單的一個切片操作就可以取得同樣的效果:
1 >>> List1 2 ['zhangxueyou', 'liuyifei', 'liudehua', 'huyidao', 'haodada', 'wumengda', 'zhouxingchi', 'chenglong', 'Jack', 'linzhilin'] 3 >>> #比較笨的辦法是直接取值 4 ... 5 >>> [List1[1],List1[2],List1[3],List1[4],List1[5]] 6 ['liuyifei', 'liudehua', 'huyidao', 'haodada', 'wumengda'] 7 >>> 8 >>> 9 >>> 10 >>> 11 #使用循環取值:比較繁瑣 12 >>> List1 13 ['zhangxueyou', 'liuyifei', 'liudehua', 'huyidao', 'haodada', 'wumengda', 'zhouxingchi', 'chenglong', 'Jack', 'linzhilin'] 14 >>> List2 = [] 15 >>> List2 16 [] 17 >>> n = 5 18 >>> for i in range(n): 19 ... List2.append(List1[i]) 20 ... 21 >>> List2 22 ['zhangxueyou', 'liuyifei', 'liudehua', 'huyidao', 'haodada'] 23 >>> #切片操作的演示: 24 ... 25 >>> List1[0:4] 26 ['zhangxueyou', 'liuyifei', 'liudehua', 'huyidao'] 27 >>> List1[0:5] 28 ['zhangxueyou', 'liuyifei', 'liudehua', 'huyidao', 'haodada'] 29 >>>
注意:List1[0:5]表示的含義是,從索引0開始直到取到5個元素,因此,取到的元素索引為:0,1,2,3,4但是不包含第六個數的索引5,這里剛好取到了5個元素。故,記住切片的口訣就是:“顧頭不顧尾”。假如你的第一個索引是“0”,那么你可以省略不寫:
1 >>> List1 2 ['zhangxueyou', 'liuyifei', 'liudehua', 'huyidao', 'haodada', 'wumengda', 'zhouxingchi', 'chenglong', 'Jack', 'linzhilin'] 3 >>> #索引為0的情況可以省略 4 ... 5 >>> List1[:5] 6 ['zhangxueyou', 'liuyifei', 'liudehua', 'huyidao', 'haodada'] 7 >>> List1[0:5] 8 ['zhangxueyou', 'liuyifei', 'liudehua', 'huyidao', 'haodada'] 9 >>>
python是支持負索引的,即List1[-1],List1[-2],同樣,切片也是支持負索引的:
1 >>> List1 2 ['zhangxueyou', 'liuyifei', 'liudehua', 'huyidao', 'haodada', 'wumengda', 'zhouxingchi', 'chenglong', 'Jack', 'linzhilin'] 3 >>> List1[-2:] 4 ['Jack', 'linzhilin'] 5 >>> List1[-2:-1] 6 ['Jack'] 7 >>> List1[:-1] 8 ['zhangxueyou', 'liuyifei', 'liudehua', 'huyidao', 'haodada', 'wumengda', 'zhouxingchi', 'chenglong', 'Jack'] 9 >>> #記住:倒數第一個元素的索引采用負索引的話就是-1
切片在python開發過程中是十分有用的,首先我們創建一個0-199的數列:
1 >>> List3 = range(199) 2 >>> List3 3 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198] 4 >>>
然后,我們就可以在其中取出任意一段長度值:
1 >>> List3[:50]#取出前50個數 2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49] 3 >>> List3[:-100]#取出前50個數 4 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98]
還可以添加“步長“取值:
1 >>> List3 2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198] 3 >>> List3[:100:5]#步長為5 4 [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95] 5 >>>
甚至什么都不寫,只寫[:]
就可以原樣復制一個list:
1 >>> List1[:] 2 ['zhangxueyou', 'liuyifei', 'liudehua', 'huyidao', 'haodada', 'wumengda', 'zhouxingchi', 'chenglong', 'Jack', 'linzhilin'] 3 >>> List2[:] 4 ['zhangxueyou', 'liuyifei', 'liudehua', 'huyidao', 'haodada'] 5 >>> List3[:] 6 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198] 7 >>>
tuple也是一種list,唯一區別是tuple不可變。因此,tuple也可以用切片操作,只是操作的結果仍是tuple:
1 >>> tuple1 = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) 2 >>> tuple1[:10] 3 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) 4 >>> tuple1[:-8] 5 (1, 2, 3, 4, 5, 6, 7) 6 >>>
字符串'xxx'
或Unicode字符串u'xxx'
也可以看成是一種list,每個元素就是一個字符。因此,字符串也可以用切片操作,只是操作結果仍是字符串:
1 >>> "ABCDEFGHIJKLMNOPQRST"[:5] 2 'ABCDE' 3 >>> "ABCDEFGHIJKLMNOPQRST"[:-6] 4 'ABCDEFGHIJKLMN' 5 >>>
在很多編程語言中,針對字符串提供了很多各種截取函數,其實目的就是對字符串切片。Python沒有針對字符串的截取函數,只需要切片一個操作就可以完成,非常簡單。
注意:當你的索引超出你要索引的元組或者列表的范圍的時候是不會報任何錯誤的,只會按照列表或者元組的的、最大長度來顯示:
1 >>> List3 2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198] 3 >>> List3[:231] #這里明顯已經超出了列表的范圍 4 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198]
python切片中的高級操作:
1. 切片的原理分析:
list的切片,內部是調用__getitem__,__setitem__,__delitem__和slice函數。而slice函數又是和range()函數相關的。
給切片傳遞的鍵是一個特殊的slice對象。該對象擁有可描述所請求切片方位的屬性,切片的含義和演示:
1 >>> List4 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] 2 >>> List4 3 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] 4 >>> x = List4[1:10] #x = List4.__getitem__(slice(1,10,None)) 5 >>> List4[1:5]=[100,111,122] #List4.setitem__(slice(1,3,None),[100,111,122]) 6 >>> del List4[1:4] #List4.del__delitem__(slice(1,4,None)) 7 >>> List4 8 [1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] 9 >>>
帶步長的python切片:
1 >>> List4 2 [1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] 3 >>> List4[0:20:2] #其中2為步長值 4 [1, 7, 9, 11, 13, 15, 17, 19] 5 >>>
注意:步進值為step
當step > 0 時
切片從 start(含start)處開始,到end(不含end)處結束,**從左往右**,每隔(step-1)(索引之間的差仍為step,但相隔的元素是step-1個)個元素進行一次截取。
這時,start 指向的位置應該在end指向的位置的左邊,否則返回值為空
當step < 0 時
切片從 start(含start)處開始,到end(不含end)處結束,**從右往左**,每隔(step-1)(索引之間的差仍為step,但相隔的元素是step-1個)個元素進行一次截取。
這時,start 指向的位置應該在end指向的位置的右邊,否則返回值為空
這里有一個比較經典的字符串反向的例子:
1 >>> strin = "Hello World!" 2 >>> strin[::-1] 3 '!dlroW olleH' 4 >>>
切片的邊界問題:
1 s=[1,2,3,4] # S 上界為 0 下界為 4 2 s[-100:100] #返回 [1,2,3,4] -100超出了上界,100超出了下界:等價於 s[0:4] 3 s[-100:-200] #返回 [] -100,-200均超出了上界,自動取上界:等價於s[0:0] 4 s[100:200] #返回 [] 100,200均超出了下界,自動取下界值:等價於s[4:4] 5 s[:100] #返回 [1,2,3,4] 開始值省略表示從第0個開始 6 s[0:] #返回 [1,2,3,4] 結束值為空表示到最后一個結束
2. 切片的擴展知識:
1 >>> id(List4) 2 140115516658320 3 #直接通過列表來賦值 List5 = List4,指向的內存地址空間是不變的,都是(140115516658320),無論刪除List4還是List5這個列表都會被刪除,即List4和List5都沒有元素了。 4 >>> List5 = List4 5 >>> List5 6 [1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] 7 >>> List4 8 [1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] 9 >>> id(List5) 10 140115516658320 11 #但是,通過切片來命名的兩個列表他們指向的內存地址編號是不同的,140115516658320 != 140115516604784 12 >>> List6 = List5 13 >>> id(List6) 14 140115516658320 15 >>> List6 = List4[:] 16 >>> id(List6) 17 140115516604784 18 >>> #地址改變 19 ... 20 >>>