将Iterators链接到Flat Iterator

时间:2017-08-02 07:26:05

标签: python python-2.7 iterator itertools

尝试使用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>

2 个答案:

答案 0 :(得分:6)

您想要使用itertools.chain.from_iterable()代替:

chained_iter = chain.from_iterable(iter_list)

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

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

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

答案 1 :(得分:0)

您可以尝试这种方式:

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