【问题标题】:Why generator iteration in list of lists doesn't work?为什么列表列表中的生成器迭代不起作用?
【发布时间】:2013-05-23 17:15:59
【问题描述】:

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

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]

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

提前致谢!

【问题讨论】:

    标签: python list for-loop iterator generator


    【解决方案1】:

    您的生成器不会遍历任何子列表;它所做的只是从 outer 列表中产生项目。 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
    

    【讨论】:

    • 应该是item作为生成器中产生的元素,而不是sub_list
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2018-11-09
      • 2018-06-22
      • 2015-05-20
      • 2021-07-12
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      相关资源
      最近更新 更多