python列表 list 的使用技巧及高階操作

2021-08-25 11:04:32 字數 4633 閱讀 2048

跟元組一樣,用加號(+)將兩個列表加起來即可實現合併:

in [1]: x=list(range(1, 13, 2))

in [2]: x + ['b', 'a']

out[2]: [1, 3, 5, 7, 9, 11, 'b', 'a']

對於已定義的列表,可以用extend方法一次性新增多個元素:

in [7]: x2=[3, 6, 1]

in [8]: x

.extend(x2)

in [9]: x

out[9]: [1, 3, 5, 7, 9, 11, 3, 6, 1, 3, 6, 1, 3, 6, 1]

需要說明的是:加號(+)執行列表的合併是非常浪費資源的,因為必須建立乙個新列表並將所有物件複製過去,而用extend將元素附加到現有列表(尤其是在構建乙個大列表時)就會好很多。

因此,在進行列表合併操作時,尤其是對於大資料量的列表合併,強烈建議使用extend函式。

列表的sort方法可以實現就地排序(無需建立新物件,字串按首字母進行排序):

in [10]: a=[1, 5, 3, -3, 0]

in [11]: a.sort()

in [12]: a

out[12]: [-3, 0, 1, 3, 5]

in [13]: s=['a','ab','3e','z']

in [14]: s.sort()

in [15]: s

out[15]: ['3e', 'a', 'ab', 'z']

sort有幾個很好用的選項,乙個是次要排序鍵,即乙個能夠產生可用於排序的值的函式。如可以通過長度對一組字串進行排序:

in [16]: b=['a','nl','drz','mowgt','aa']

in [17]: b.sort(key=len)

in [18]: b

out[18]: ['a', 'nl', 'aa', 'drz', 'mowgt']

再比如是否進行降序排列,如下面通過對首字母進行降序排列的示例:

in [21]: b.sort(key= lambda x:x[0], reverse=true)

in [22]: b

out[22]: ['nl', 'mowgt', 'drz', 'a', 'aa']

內建的bisect模組實現了二分查詢以及對有序列表的插入操作。bisect.bisect可以找出新元素應該被插入到哪個位置以保持元列表的有序性,bisect.insort則將新元素插入到那個正確的位置上。

in [23]: import bisect

in [24]: c=[1,2,1,-1,4,5]

in [25]: c.sort()

in [26]: bisect.bisect(c, 2)

out[26]: 4

in [27]: bisect.insort(c, 4)

in [28]: c

out[28]: [-1, 1, 1, 2, 4, 4, 5]

注意:bisect模組的函式不會判斷原列表是否有序,因為這樣做開銷太大;因此將他們用作無序列表時雖然不會出錯,但可能會導致不正確的結果。基於此,建議在使用bisect模組的函式前,先對原列表執行排序的操作。

可以對序列型別(陣列、列表、元組等)進行切片操作,start索引處元素被包括在切片的結果中,stop索引處的元素未被包括在結果中,元素數量為stop-startstartstop都是可以省略的,此時他們分別預設為序列的起始處和結尾處。

還可以在第二個冒號後加上步長(step),比如每隔一位取乙個元素:

in [35]: d=[x for x in

range(10)]

in [36]: d

out[36]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

in [37]: e=d[:8:2]

in [38]: e

out[38]: [0, 2, 4, 6]

可以巧妙的使用-1,實現對列表或元素的反序,如下:

in [40]: f=d[::-1]

in [41]: f

out[41]: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

enumerate函式可以逐個返回序列的(i, value)元組,如下示例:

in [43]: #for i value in enumerate(collection):

in [44]: #用 i, value 做一些事情

in [49]: slist=['qin', 'wang', 'wqc']

out[51]:

sorted函式可以將任何序列返回為乙個新的有序列表(注意:sort函式是就地排序),如下:

in [59]: sorted(['z', 'd', 'c', 'n'])

out[59]: ['c', 'd', 'n', 'z']

in [60]: sorted('my name is chaogo')

out[60]:

[' ',

' ',

' ',

'a',

'a',

'c',

'e',

'g',

'h',

'i',

'm',

'm',

'n',

'o',

'o',

's',

'y']

常常將sortedset結合起來使用以得到乙個由序列中的唯一元素構成的有序列表:

in [61]: set(sorted('my name is chaogo'))

out[61]:

in [62]: sorted(set('my name is chaogo'))

out[62]: [' ', 'a', 'c', 'e', 'g', 'h', 'i', 'm', 'n', 'o', 's', 'y']

in [63]: set('my name is chaogo')

out[63]:

上面的結果都是一樣的,什麼原因呢?這是因為:

(1)setsorted是對序列進行操作,當引數不是序列時,會預設轉換為列表;

(2)set缺省會對元素進行排序。

zip用於將多個序列(列表、元組等)中的元素「配對」,從而產生乙個新的元組列表;

zip可以接受任意數量的序列,最終得到的元組數量由最短的序列決定;

zip最常見的用法是同時迭代多個序列,還可以結合enumerate一起使用,如下:

in [77]: seq1 = ['chao', 'qing', 'wq']

in [78]: seq2 = ['qin', 'wang', 'qc']

in [79]: for i , (a,b) in enumerate(zip(seq1, seq2)):

...: print('%d: %s %s' % (i, a, b))

...:

0: chao qin

1: qing wang

2: wq qc

對於「已壓縮的」(zipped)序列,zip還有乙個很巧妙的用法,即對該序列進行解壓(unzip,用*表示)。其實就是將一組行轉換為一組列,如下:

in [86]: pitchers = [('a','b'), (1,2), ('***','bat')]

in [87]: one, two = zip(*pitchers)

in [88]: one

out[88]: ('a', 1, '***')

in [89]: two

out[89]: ('b', 2, 'bat')

用於按逆序迭代序列中的元素,如下:

in

[92]: [x for x in reversed([1, 2, 5, 3, -1])]

out[92]: [-1, 3, 5, 2, 1]

list列表的使用

python最常用的資料型別之一,通過列表可以對資料實現最方便的儲存 修改等操作 list1 1,2,3,4,5,6,7,8,9 建立列表 z list 1,2,3,4,5,6,7,8 建立列表 注 列表的下標值是從0開始取值的,想取最後乙個值時,結束位不能是 1,因為結束位的元素不包括,所以只能留...

python中列表list的基本使用

list 1,2,3 list 1,2,3 2 list.extend l 將乙個給定列表中的所有元素都新增到另乙個列表中 list extend 5,6,7 list 1,2,3,4,5,6,7 3 list.insert i,x list.insert 0,9 list 9,1,2,3,4,5,...

python列表(list)使用心得

list test 1,2,3,4,5,6,7 2.新增元素 向列表中新增乙個物件object list test 1,2,3,4,5,6,7,8,9 把乙個序列seq的內容新增到列表中 list test.extend 8,9 list test 1,2,3,4,5,6,7,8,9 3.插入乙個元...