Python idioma de cadeia (achatar) um infinito iteráveis ??de iterables finitos? [duplicado]
Pergunta
Esta questão já tem uma resposta aqui:
- Como fazer uma lista simples de lista de listas 39 respostas
Suponha que tenhamos um iterador (uma uma infinita) que listas de retornos (ou iterators finitos), por exemplo um retornado por
infinite = itertools.cycle([[1,2,3]])
O que é um bom Python idioma para obter um iterador (obviamente infinita) que irá retornar cada um dos elementos da primeira iteração, então cada um a partir do segundo, etc. No exemplo acima, ele retornaria 1,2,3,1,2,3,...
. O iterador é infinito, então itertools.chain(*infinite)
não vai funcionar.
Relacionados
Solução
A partir do Python 2.6, você pode usar itertools.chain.from_iterable
:
itertools.chain.from_iterable(iterables)
Você também pode fazer isso com uma compreensão gerador aninhada:
def flatten(iterables):
return (elem for iterable in iterables for elem in iterable)
Outras dicas
Use um gerador:
(item for it in infinite for item in it)
Os Desembala * construto em uma tupla, a fim de passar os argumentos, então não há nenhuma maneira de usá-lo.