Если итератор Python возвращает итерируемые объекты, как я могу объединить эти объекты в один большой итератор? - PullRequest
4 голосов
/ 29 ноября 2010

Я приведу упрощенный пример здесь.Предположим, у меня есть итератор в python, и каждый объект, который возвращает этот итератор, сам по себе итеративен.Я хочу взять все объекты, возвращенные этим итератором, и объединить их в один длинный итератор.Есть ли стандартная утилита, чтобы сделать это возможным?

Вот надуманный пример.

x = iter([ xrange(0,5), xrange(5,10)])

x - это итератор, который возвращает итераторы, и я хочу объединить все итераторы, возвращаемые x, в один большой итератор.Результат такой операции в этом примере должен быть эквивалентен xrange (0,10), и его следует оценивать лениво.

Ответы [ 2 ]

10 голосов
/ 29 ноября 2010

Вы можете использовать itertools.chain.from_iterable

>>> import itertools
>>> x = iter([ xrange(0,5), xrange(5,10)])
>>> a = itertools.chain.from_iterable(x)
>>> list(a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Если это не доступно в вашей версии (очевидно, она новая в 2.6), вы можете просто сделать это вручную:

>>> x = iter([ xrange(0,5), xrange(5,10)])
>>> a = (i for subiter in x for i in subiter)
>>> list(a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3 голосов
/ 29 ноября 2010

Вот старомодный способ:

Python 2.2.3 (#42, May 30 2003, 18:12:08) [MSC 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from __future__ import generators
>>> def mychain(iterables):
...     for it in iterables:
...         for item in it:
...             yield item
...
>>> x = iter([ xrange(0,5), xrange(5,10)])
>>> a = mychain(x)
>>> list(a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>

Я не уверен, какова цель или польза от использования iter(), в данном случае:

>>> x = [xrange(0,5), xrange(5,10)]
>>> a = mychain(x)
>>> list(a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
...