iteradores - python funcion yield
Python idiom para encadenar(iterar) un iterable infinito de iterables finitos? (2)
Esta pregunta ya tiene una respuesta aquí:
- Hacer una lista plana de la lista de listas en Python 25 respuestas
Supongamos que tenemos un iterador (uno infinito) que devuelve listas (o iteradores finitos), por ejemplo, uno devuelto por
infinite = itertools.cycle([[1,2,3]])
¿Qué es un buen modismo de Python para obtener un iterador (obviamente infinito) que devolverá cada uno de los elementos del primer iterador, luego cada uno del segundo, etc. En el ejemplo anterior, devolvería 1,2,3,1,2,3,...
El iterador es infinito, por lo que itertools.chain(*infinite)
no funcionará.
Relacionado
Usa un generador:
(item for it in infinite for item in it)
La * construcción se descomprime en una tupla para pasar los argumentos, por lo que no hay forma de usarla.
Comenzando con Python 2.6, puede usar itertools.chain.from_iterable
:
itertools.chain.from_iterable(iterables)
También puede hacer esto con una comprensión de generación anidada:
def flatten(iterables):
return (elem for iterable in iterables for elem in iterable)