eal*_*eon 54 python list-comprehension
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]
Run Code Online (Sandbox Code Playgroud)
这是骗我的.
我的理解是ELEM名单从内部列表for elem in vic
我不太明白的用法num
,并for num in elem
在开始和结束.
python如何解释这个?
它看起来的顺序是什么?
Inb*_*ose 101
让我们分解吧.
一个简单的列表理解:
[x for x in collection]
Run Code Online (Sandbox Code Playgroud)
如果我们把它分成几部分,这很容易理解: [A for B in C]
A
是结果列表中的项目B
是集合中的每个项目 C
C
是集合本身.通过这种方式,人们可以写:
[x.lower() for x in words]
Run Code Online (Sandbox Code Playgroud)
为了将列表中的所有单词转换为小写.
当我们将其与另一个列表复杂化时,就像这样:
[x for y in collection for x in y] # [A for B in C for D in E]
Run Code Online (Sandbox Code Playgroud)
在这里,有些特别的事情发 我们希望我们的最终列表包含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
Run Code Online (Sandbox Code Playgroud)
为了扩展这个,并给出一个很好的例子+解释,想象一下有一列火车.
火车引擎(前面)总是在那里(列表理解的结果)
然后,有任意数量的火车车厢,每辆火车车厢的形式如下: for x in y
列表理解可能如下所示:
[z for b in a for c in b for d in c ... for z in y]
Run Code Online (Sandbox Code Playgroud)
这就像拥有这个常规for循环:
for b in a:
for c in b:
for d in c:
...
for z in y:
# have z
Run Code Online (Sandbox Code Playgroud)
换句话说,在列表理解中,您只需将下一个循环添加到结尾,而不是沿着一行和缩进.
回到火车比喻:
Engine
- Car
- Car
- Car
......Tail
什么是尾巴?尾部是列表推导中的特殊事物.你不需要一个,但如果你有一个尾巴,尾巴是一个条件,看看这个例子:
[line for line in file if not line.startswith('#')]
Run Code Online (Sandbox Code Playgroud)
只要该行没有以hashtag(#
)开头,就会跳过其他行,这将为您提供文件中的每一行.
使用列车"尾部"的诀窍是,在您从所有循环获得最终的"引擎"或"结果"的同时检查其是否为真/假,上述示例为常规for循环看起来像这样:
for line in file:
if not line.startswith('#'):
# have line
Run Code Online (Sandbox Code Playgroud)
请注意:虽然在我对火车的比喻中,火车末端只有一个"尾巴",但每个 '汽车'或循环后的情况或"尾巴"都可以...
例如:
>>> 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]
Run Code Online (Sandbox Code Playgroud)
在常规for循环中:
>>> for y in z:
if sum(y)>10:
for x in y:
if x < 10:
print x
5
6
7
8
9
Run Code Online (Sandbox Code Playgroud)
从列表理解文档:
当提供列表推导时,它由一个表达式后跟至少一个
for
子句和零个或多个for
或if
子句组成.在这种情况下,新列表的元素是通过将每个for或if子句从左到右嵌套,并且每次到达最内部块时评估表达式以生成列表元素而生成的元素. .
换句话说,假装for
循环是嵌套的.从左到右阅读您的列表理解可以嵌套为:
for elem in vec:
for num in elem:
num # the *single expression* from the spec
Run Code Online (Sandbox Code Playgroud)
列表推导将使用最后一个最内层的块作为结果列表的值.
您可以将列表理解视为顺序语句。这适用于任何级别for
和if
语句。
例如,考虑for
带有自己的if
s 的双循环:
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]
Run Code Online (Sandbox Code Playgroud)
这里的列表理解与:
result = []
for e in vec:
if len(e)==3:
for i in e:
if i%2==0:
result.append(i)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,列表理解很简单for
,if
没有缩进,但顺序相同。
你的代码等于:
temp = []
for elem in vec:
for num in elem:
temp.append(num)
Run Code Online (Sandbox Code Playgroud)