让我们分解它。
一个简单的列表理解:
[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) –