Как объединить два итератора Python? - PullRequest
21 голосов
/ 28 октября 2008

У меня есть два итератора, объект list и объект itertools.count (т.е. генератор бесконечных значений). Я хотел бы объединить эти два в итоговый итератор, который будет чередовать значения выхода между этими двумя:

>>> import itertools
>>> c = itertools.count(1)
>>> items = ['foo', 'bar']
>>> merged = imerge(items, c)  # the mythical "imerge"
>>> merged.next()
'foo'
>>> merged.next()
1
>>> merged.next()
'bar'
>>> merged.next()
2
>>> merged.next()
Traceback (most recent call last):
    ...
StopIteration

Какой самый простой и краткий способ сделать это?

Ответы [ 13 ]

0 голосов
/ 27 декабря 2008

Краткий метод - использовать выражение генератора с помощью itertools.cycle (). Это позволяет избежать создания длинной цепочки () кортежей.

generator = (it.next() for it in itertools.cycle([i1, i2]))
0 голосов
/ 06 декабря 2008

Использование itertools.izip () вместо zip (), как в некоторых других ответах, улучшит производительность:

Как показывает «pydoc itertools.izip»: «Работает как функция zip (), но потребляет меньше памяти, возвращая итератор вместо списка».

Itertools.izip также будет работать правильно, даже если один из итераторов бесконечен.

0 голосов
/ 29 октября 2008

Зачем нужны itertools?

def imerge(a,b):
    for i,j in zip(a,b):
        yield i
        yield j

В этом случае хотя бы один из a или b должен иметь конечную длину, потому что zip вернет список, а не итератор. Если вам нужен итератор в качестве вывода, тогда вы можете перейти к решению Claudiu.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...