如果我们有一份清单清单:
super_list = [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]
我们希望迭代我们写的内部元素:
for sub_list in super_list:
for item in sub_list:
print item
我们将会有这个:
# 0
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
但是,当我们想要使用'生成器'语法:
for item in (sub_list for sub_list in super_list):
print item
我们将会有这个:
# [0, 1, 2, 3, 4]
# [5, 6, 7, 8, 9]
我的问题是:为什么?发生器到底发生了什么?
提前致谢!
答案 0 :(得分:4)
您的生成器不会遍历任何子列表;它只是从外部列表中产生项目。 for
循环不会循环生成器生成的项目,循环生成器本身。
您需要添加额外级别:
for item in (item for sub_list in super_list for item in sub_list):
当您将生成器分配给变量然后在其上使用next()
时,您可以看到这一点:
>>> super_list = [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]
>>> gen = (sub_list for sub_list in super_list for item in sub_list)
>>> next(gen)
[0, 1, 2, 3, 4]
>>> gen = (item for sub_list in super_list for item in sub_list)
>>> next(gen)
0
>>> for item in (item for sub_list in super_list for item in sub_list):
... print item
...
0
1
2
3
4
5
6
7
8
9
答案 1 :(得分:2)
生成器表达式(sub_list for sub_list in super_list)
将为super_list
中的元素提供迭代器,它与iter(super_list)
基本相同。因此,如果您对此进行迭代,则与直接迭代super_list
无异。
如果您想使用生成器来访问嵌套元素,您可以这样做,但它看起来像这样:
for item in (item for sub_list in super_list for item in sub_list):
print item
或者您可以使用itertools.chain.from_iterable
:
from itertools import chain
for item in chain.from_iterable(sub_list):
print item