Я заметил, что itertools
не имеет (как мне кажется) функции, способной чередовать элементы из нескольких других итерируемых объектов (в отличие от архивирования их):
def leaf(*args): return (it.next() for it in cycle(imap(chain,args)))
tuple(leaf(['Johann', 'Sebastian', 'Bach'], repeat(' '))) => ('Johann', ' ', 'Sebastian', ' ', 'Bach', ' ')
(Правка) Причина, по которой я спрашиваю, заключается в том, что я хочу избежать ненужных вхождений zip / flatten.
Очевидно, определение leaf
достаточно просто, но если есть предопределенная функция, которая делает то же самое, я бы предпочел использовать это, или очень четкое выражение генератора. Есть ли такая встроенная функция, в itertools или в какой-либо другой известной библиотеке, или подходящее идиоматическое выражение?
Редактировать 2: возможно даже более краткое определение (с использованием пакета functional
):
from itertools import *
from functional import *
compose_mult = partial(reduce, compose)
leaf = compose_mult((partial(imap, next), cycle, partial(imap, chain), lambda *args: args))