讓我們分解它。
一個簡單的列表理解:
[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 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('#')]
這隻要給你一個文件中的每一行線沒」 t以標籤(#
)開頭,其他人只是跳過。
使用列車「尾巴」的技巧是,在你有來自所有循環的最終'引擎'或'結果'的同時檢查是否爲真/假,以上示例爲定期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
[在列表綜合雙迭代](可能重複http://stackoverflow.com/questions/1198777/double - 在列表中理解) –
這不是一個很好的@Inbar的愚蠢目標,因爲它沒有解釋Python如何解釋嵌套循環的順序。 –
相關/可能的欺騙:[嵌套列表解析](http://stackoverflow.com/a/11934483) –