Работа с генераторами python

Мне нужно написать некий аналог chain, который может вытаскивать из генераторов поочередно по одному значению (генераторы лежат в списке arg_list) и выводить в один список

Я попробовала так:

list(map(lambda *i: i, *arg_list))

Однако это работает только для генераторов одинакового размера, а мне нужно если один заканчивается, продолжать выводить значения из других

Что здесь можно придумать?


Ответы (1 шт):

Автор решения: extrn
from itertools import zip_longest

arg_list = [[1,2], [3,4,5], [6]]

print([
    x
    for tup in zip_longest(*arg_list)
    for x in tup
    if x is not None
])
[1, 3, 6, 2, 4, 5]

Или вот более универсальный вариант, если среди элементов может встречаться None

arg_list = [[1,2], [3,4,5], [6, None]]
fill = object()

print([
    x
    for tup in zip_longest(*arg_list, fillvalue=fill)
    for x in tup
    if x is not fill
])
[1, 3, 6, 2, 4, None, 5]
→ Ссылка