Noté que itertools
no (me parece) tiene una función capaz de elementos de intercalado de varios otros objetos iterables (en contraposición a comprimirlos):¿Python tiene una función incorporada para entrelazar generadores/secuencias?
def leaf(*args): return (it.next() for it in cycle(imap(chain,args)))
tuple(leaf(['Johann', 'Sebastian', 'Bach'], repeat(' '))) => ('Johann', ' ', 'Sebastian', ' ', 'Bach', ' ')
(Edit) La razón que pido es porque Quiero evitar las apariciones zip/flatten innecesarias.
Obviamente, la definición de leaf
es bastante simple, pero si hay una función predefinida que hace lo mismo, preferiría usar eso, o una expresión de generador muy clara. ¿Existe tal función incorporada, en itertools, o en alguna otra biblioteca bien conocida, o una expresión idiomática adecuada?
Edición 2: Una definición más concisa es posible (utilizando el paquete 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))
En una nota totalmente no relacionada, no puedo dejar de mencionar que el Bach en cuestión era Johann, no John. – 9000
@ 9000: Bastante - esto cayó de una prueba unitaria donde lo escribí distraídamente ya que es – Marcin