0

如果我们有一个列表列表:

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]

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

提前致谢!

4

2 回答 2

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
于 2013-05-23T17:18:04.957 回答
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
于 2013-05-23T17:19:09.477 回答