【问题标题】:Chaining Iterators To Flat Iterator将迭代器链接到平面迭代器
【发布时间】:2018-01-09 06:51:10
【问题描述】:

尝试使用来自 itertools 的链来解决我的问题。我有一个迭代器列表,我想获得一个迭代器,它以无缝方式遍历列表中的迭代器项。有没有办法这样做?也许其他工具而不是链会更合适?

我的代码的简化示例:

iter1 = iter([1,2])
iter2 = iter([3,4])
iter_list = [iter1, iter2]
chained_iter = chain(iter_list)

想要的结果:

chained_iter.next() --> 1
chained_iter.next() --> 2
chained_iter.next() --> 3
chained_iter.next() --> 4

实际结果:

chained_iter.next() --> <listiterator at 0x10f374650>

【问题讨论】:

    标签: python python-2.7 iterator itertools


    【解决方案1】:

    您想改用itertools.chain.from_iterable()

    chained_iter = chain.from_iterable(iter_list)
    

    您将单个可迭代对象传递给chain();它旨在从 multiple 迭代中获取元素并将它们链接起来。单个可迭代对象包含更多迭代器并不重要。

    您也可以使用* 语法应用该列表:

    chained_iter = chain(*iter_list)
    

    这适用于列表,但如果 iter_list 本身是一个无限迭代器,您可能不希望 Python 尝试将其扩展为单独的参数。

    演示:

    >>> from itertools import chain
    >>> iter1 = iter([1, 2])
    >>> iter2 = iter([3, 4])
    >>> iter_list = [iter1, iter2]
    >>> chained_iter = chain.from_iterable(iter_list)
    >>> next(chained_iter)
    1
    >>> next(chained_iter)
    2
    >>> next(chained_iter)
    3
    >>> next(chained_iter)
    4
    

    【讨论】:

      【解决方案2】:

      你可以试试这个方法:

      >>> from itertools import chain
      >>> iter1 = iter([1,2])
      >>> iter2 = iter([3,4])
      >>> iter_list = [iter1, iter2]
      >>> chained_iter = chain(*iter_list)
      >>> next(chained_iter)
      1
      >>> next(chained_iter)
      2
      >>> next(chained_iter)
      3
      >>> next(chained_iter)
      4
      >>>
      

      【讨论】:

        猜你喜欢
        • 2022-10-15
        • 1970-01-01
        • 2014-03-25
        • 2023-03-27
        • 1970-01-01
        • 2018-04-26
        • 2010-11-25
        • 2014-10-14
        • 2011-05-17
        相关资源
        最近更新 更多