Если все ваши генераторы имеют одинаковую длину (включая бесконечную), вы можете связать вместе значения, сгенерированные с помощью zip()
:
from itertools import chain
chain.from_iterable(zip(*gen_list))
Если длины могут отличаться, и израсходованные генераторы следует выбросить, используйте пример roundrobin()
из документации itertools
:
from itertools import cycle, islice
def roundrobin(*iterables):
"roundrobin('ABC', 'D', 'EF') --> A D E B F C"
# Recipe credited to George Sakkis
num_active = len(iterables)
nexts = cycle(iter(it).__next__ for it in iterables)
while num_active:
try:
for next in nexts:
yield next()
except StopIteration:
# Remove the iterator we just exhausted from the cycle.
num_active -= 1
nexts = cycle(islice(nexts, num_active))
Демо из последних:
>>> from itertools import repeat, islice
>>> ones_gen = repeat(1)
>>> twos_gen = repeat(2)
>>> limited_threes_gen = islice(repeat(3), 2) # just two values
>>> rrgen = roundrobin(ones_gen, twos_gen, limited_threes_gen)
>>> next(rrgen)
1
>>> next(rrgen)
2
>>> next(rrgen)
3
>>> next(rrgen)
1
>>> next(rrgen)
2
>>> next(rrgen)
3
>>> next(rrgen)
1
>>> next(rrgen)
2
>>> next(rrgen)
1
Тройки закончились, но два других генератора продолжают работать.