[英]python list comprehension double for
vec = [[1,2,3], [4,5,6], [7,8,9]]
print [num for elem in vec for num in elem] <----- this
>>> [1, 2, 3, 4, 5, 6, 7, 8, 9]
這是在欺騙我。
我知道 elem 是來自for elem in vic
的列表中的列表
我不太明白num
和for num in elem
的開頭和結尾的用法。
python如何解釋這個?
它查看的順序是什么?
讓我們分解它。
一個簡單的列表理解:
[x for x in collection]
如果我們把它分成幾部分,這很容易理解: [A for B in C]
A
是將在結果列表中的項目B
是集合C
中的每一項C
是集合本身。這樣,可以寫:
[x.lower() for x in words]
為了將列表中的所有單詞轉換為小寫。
當我們用另一個列表將其復雜化時,如下所示:
[x for y in collection for x in y] # [A for B in C for D in E]
在這里,發生了一些特別的事情。 我們希望我們的最終列表包含A
項,而A
項位於B
項中,因此我們必須告訴列表理解。
A
是將在結果列表中的項目B
是集合C
中的每一項C
是集合本身D
是集合E
中的每個項目(在這種情況下,也是A
)E
是另一個集合(在這種情況下, B
)這個邏輯類似於普通的 for 循環:
for y in collection: # for B in C:
for x in y: # for D in E: (in this case: for A in B)
# receive x # # receive A
為了擴展這一點,並給出一個很好的例子+解釋,想象一下有一列火車。
火車引擎(前面)總是會在那里(列表理解的結果)
那么,有任意數量的火車車廂,每個火車車廂的形式為: for x in y
列表理解可能如下所示:
[z for b in a for c in b for d in c ... for z in y]
這就像有這個常規的 for 循環:
for b in a:
for c in b:
for d in c:
...
for z in y:
# have z
換句話說,在列表理解中,您只需將下一個循環添加到末尾,而不是向下一行並縮進。
回到火車的比喻:
Engine
- Car
- Car
- Car
... Tail
什么是尾巴? 尾部在列表推導式中是一個特殊的東西。 你不需要一個,但如果你有尾巴,尾巴是一個條件,看這個例子:
[line for line in file if not line.startswith('#')]
這將為您提供文件中的每一行,只要該行不以主題標簽 ( #
) 開頭,其他行就會被跳過。
使用火車“尾部”的訣竅是在您從所有循環中獲得最終“引擎”或“結果”的同時檢查它的真/假,上面的例子是一個常規的 for 循環看起來像這樣:
for line in file:
if not line.startswith('#'):
# have line
請注意:雖然在我對火車的比喻中,火車的末端只有一個“尾巴”,但條件或“尾巴”可以在每個“汽車”或循環之后......
例如:
>>> z = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
>>> [x for y in z if sum(y)>10 for x in y if x < 10]
[5, 6, 7, 8, 9]
在常規 for 循環中:
>>> for y in z:
if sum(y)>10:
for x in y:
if x < 10:
print x
5
6
7
8
9
從列表理解文檔:
提供列表推導式時,它由一個表達式組成,后跟至少一個
for
子句和零個或多個for
或if
子句。 在這種情況下,新列表的元素是通過將每個 for 或 if 子句視為一個塊,從左到右嵌套,並在每次到達最里面的塊時計算表達式以生成一個列表元素而產生的元素.
換句話說,假設for
循環是嵌套的。 從左到右閱讀您的列表理解可以嵌套為:
for elem in vec:
for num in elem:
num # the *single expression* from the spec
其中列表理解將使用最后一個最里面的塊作為結果列表的值。
您的代碼等於:
temp = []
for elem in vec:
for num in elem:
temp.append(num)
您可以將列表理解視為順序語句。 這適用於任何級別的for
和if
語句。
例如,考慮帶有自己的if
s 的 double for
循環:
vec = [[1,2,3], [4,5,6], [7,8,9]]
result = [i for e in vec if len(e)==3 for i in e if i%2==0]
這里的列表理解與:
result = []
for e in vec:
if len(e)==3:
for i in e:
if i%2==0:
result.append(i)
如您所見,列表推導式只是for
和if
沒有縮進但順序相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.