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('#')]
只要该行不是以井号(#
)开头,其他行都将被跳过,这将为您提供文件中的每一行。
使用火车“尾巴”的技巧是,在所有循环中都有最终的“引擎”或“结果”时,同时检查其是否为真/假,上面的示例在常规的html" target="_blank">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