Python之列表推導式

2021-08-14 08:25:37 字數 3887 閱讀 3563

如下是python官方文件中列表推導式部分的譯文,筆者對於該部分也是初學,只能從官方文件學起了。有不合適的地方還望指正,謝謝。

python官網列表推導式部分

一 列表推導式

列表推導式提供了一種建立list的簡便方法。應用程式建立列表時,列表中的元素**於其他序列、可迭代物件或建立的乙個滿足一定條件的序列。

例如,假設我們要建立乙個平方數組成的列表,比如:

squares = 

for x in range(10):

print(squares)

輸出

結果:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
我們也可以通過下面的方式獲得相同的列表:

squares = [x**2 for x in range(10)]
這也等價於下面的方式,但列表推導式的方式更簡單。

squar = map(lambda x:x**2,range(10))
對於函式map(function,iterable),其含有兩個引數,第乙個引數function是乙個函式,第二個引數是乙個列表。列表中的每乙個元素呼叫函式function,結果構成乙個新的序列。

關於map()函式和map物件,請參考:

python 函式之map()——張之海的部落格

菜鳥教程之python map()函式

python3.x中map物件的訪問方式——

關於lambda,請參考:

python lambda —— csdn

列表推導式包含一對括號,在括號中有乙個表示式,表示式後面緊跟一條for語句,然後是零條或多條,for語句或if語句。通過for語句和if語句計算出表示式,結果作為新列表的元素。例如,下面的列表推導式將兩個不同列表中的元素整合到了一起:

>>> [(x,y)for x in [1,2,3] for y in [3,1,4] if x != y]

[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

這等價於:

>>> combs = 

>>> for x in [1,2,3]:

for y in [3,1,4]:

if x != y:

>>> combs

[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

注意:for語句和if語句在這兩段程式片中的順序是相同的。

如果表示式是乙個元組(例如前面例子中的(x,y)),那麼必須得給它加上括號。

>>> vec = [-4,-2,0,2,4]

>>> #用vec中元素的倍數,建立乙個陣列

>>> [x*2 for x in vec]

[-8, -4, 0, 4, 8]

>>> #過濾列表,刪除列表中的負數

>>> [x for x in vec if x >= 0]

[0, 2, 4]

>>> #對列表中的每個元素應用乙個函式

>>> [abs(x) for x in vec]

[4, 2, 0, 2, 4]

>>> #對每個元素呼叫乙個方法

>>> freshfruit = ['000banana00','0000loganberry0','0passion fruit00000']

>>> [weapon.strip('0') for weapon in freshfruit]#str.strip(ch) : 刪除字串開頭結尾處的字元ch

['banana', 'loganberry', 'passion fruit']

>>> #建立乙個2元元組,比如(number,square)

>>> [(x,x**2) for x in range(6)]

[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]

>>> #元組必須用括號包圍,不然就會出錯

>>> [x,x**2 for x in range(6)]

syntaxerror: invalid syntax

>>> #將乙個多維陣列轉化為乙個一維陣列

>>> vec = [[1,2,3],[4,5,6],[7,8,9]]

>>> [num for elem in vec for num in elem]

[1, 2, 3, 4, 5, 6, 7, 8, 9]

列表推導式可以包含複雜表示式和巢狀函式;

>>> from math import pi

>>> [str(round(pi,i)) for i in range(1,6)]

['3.1', '3.14', '3.142', '3.1416', '3.14159']

對於round函式,其本身的執行與python的版本有關和計算機的精度有關,詳情請參考下面的鏈結,此處可簡單理解為取pi的i位有效數字。

菜鳥教程-python round()函式

python中關於round()函式的小坑

二 巢狀列表推導式

列表推導式中,最基本的表示式可以是任意表示式,包括其他列表推導式。

下面的3*4的矩陣,可以當做乙個列表list,該列表由3個長度為4的子列表的組成:

>>> matrix = [

[1,2,3,4],

[5,6,7,8],

[9,10,11,12],

]>>> matrix

[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]

使用下面的列表推導式轉置行和列:

>>> [[row_list[j] for row_list in matrix]for j in range(4)]

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

從前面的小節中可以看出,巢狀的列表推導式是在for迴圈的body中進行計算的,所以上滿的例子等同於:

>>> transposed = 

>>> for j in range(4):

>>> transposed

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

也等同於:

>>> transposed

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

>>> transposed =

>>> for j in range(4):

#下面的三行實現了巢狀列表推導式

transposed_row =

for row_list in matrix:

>>> transposed

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

在現實情況中,與複雜的流式語句相比,你可能更喜歡python的內建函式。那麼,zip()函式就更適合與完成上面的工作了。

>>> zipp = zip(*matrix)

>>> list(zipp)

[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]]

關於zip()函式,

請參考:

菜鳥教程之python zip()函式

python中使用zip()函式——csdn

python之列表推導式篇

商品打折 python列表推導式 打折 newlistname expression for in var listname 大於 newlistname var for var in listname if condition newlistname 新生成的列表名稱 expression 表示式...

Python之 列表推導式與字典推導式

四 列表推導式與字典推導式 在 python 中推導式是一種非常 pythonic 的知識,本篇將解答列表推導式與字典推導式相關的技術知識。4.1 列表推導式 列表推導式可以利用列表,元組,字典,集合等資料型別,快速的生成乙個特定需要的列表。語法格式如下 表示式 for 迭代變數 in 可迭代物件 ...

python之列表推導式,字典推導式,集合推導式

列表推導式 表示式 for 變數 in 舊列表 或者 表示式 for 變數 in 舊列表 if 條件 names sc sfd sdfbgf dgnh b 過濾掉長度小於等於3的名字 print len name 3for name in names print name for name in n...