Идиома Python для объединения (сглаживания) бесконечной итерации из конечных итераций?

Предположим, у нас есть итератор (бесконечный), который возвращает списки (или конечные итераторы), например один, возвращаемый

infinite = itertools.cycle([[1,2,3]])

Что такое хорошая идиома Python для получения итератора (очевидно, бесконечного), который будет возвращать каждый из элементов от первого итератора, затем каждый из второго и т. Д. В приведенном выше примере он вернул бы 1,2,3,1,2,3,..., Итератор бесконечен, поэтому itertools.chain(*infinite) не будет работать.

связанные с

2 ответа

Решение

Начиная с Python 2.6, вы можете использовать itertools.chain.from_iterable:

itertools.chain.from_iterable(iterables)

Вы также можете сделать это с помощью вложенного генератора:

def flatten(iterables):
    return (elem for iterable in iterables for elem in iterable)

Используйте генератор:

(item for it in infinite for item in it)

Конструкция * распаковывает в кортеж для передачи аргументов, поэтому нет возможности использовать его.

Другие вопросы по тегам