为什么列表列表中的生成器迭代不起作用?

时间:2013-05-23 17:16:00

标签: python list for-loop iterator generator

如果我们有一份清单清单:

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]

我的问题是:为什么?发生器到底发生了什么?

提前致谢!

2 个答案:

答案 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