Eu quero mudar o seguinte código
for directory, dirs, files in os.walk(directory_1):
do_something()
for directory, dirs, files in os.walk(directory_2):
do_something()
para este código:
for directory, dirs, files in os.walk(directory_1) + os.walk(directory_2):
do_something()
Eu recebo o erro:
tipo (s) de operando não suportado para +: 'generator' e 'generator'
Como juntar dois geradores em Python?
Respostas:
Eu acho que
itertools.chain()
deveria fazê-lo.fonte
itertools.chain()
não retorna umatypes.GeneratorType
instância. Apenas no caso de o tipo exato ser crucial.Um exemplo de código:
fonte
itertools.chain()
resposta já existente e altamente votada ?No Python (3.5 ou superior), você pode fazer:
fonte
def chain(*iterables): for iterable in iterables: yield from iterable
(Coloque odef
efor
. Em linhas separadas quando você executá-lo)a
é verificado até que tudo seja gerado, mesmo queb
não seja um iterador. OTypeError
porb
não ser um iterador será exibido mais tarde.Exemplo simples:
fonte
itertools.chain()
resposta já existente e altamente votada ?itertools.chain
retorna um iterador, não um gerador.chain([1, 2, 3], [3, 4, 5])
?Com itertools.chain.from_iterable, você pode fazer coisas como:
fonte
genny
quando ele já retorna um gerador.list(itertools.chain.from_iterable(genny(x)))
é muito mais conciso.list
construtor será muito mais legível que a compreensão da lista. Seu método é muito mais ilegível a esse respeito.Aqui está usando uma expressão de gerador com
for
s aninhados :fonte
Pode-se também usar o operador de desempacotamento
*
:NOTA: Funciona com mais eficiência para iteráveis 'não preguiçosos'. Também pode ser usado com diferentes tipos de compreensão. A maneira preferida para concat do gerador seria a partir da resposta de @Uduse
fonte
Se você deseja manter os geradores separados, mas ainda iterar sobre eles ao mesmo tempo, você pode usar zip ():
NOTA: A iteração para no menor dos dois geradores
Por exemplo:
fonte
Digamos que precisamos de geradores (geração 1 e geração 2) e queremos realizar algum cálculo extra que exija o resultado de ambos. Podemos retornar o resultado dessa função / cálculo por meio do método map, que por sua vez retorna um gerador no qual podemos fazer um loop.
Nesse cenário, a função / cálculo precisa ser implementada através da função lambda. A parte complicada é o que pretendemos fazer dentro do mapa e sua função lambda.
Forma geral da solução proposta:
fonte
Todas essas soluções complicadas ...
apenas faça:
Se você realmente deseja "unir" os dois geradores, faça:
fonte
Eu diria que, como sugerido nos comentários do usuário "wjandrea", a melhor solução é
Não altera o tipo retornado e é realmente python.
fonte