Chcę zmienić następujący kod
for directory, dirs, files in os.walk(directory_1):
do_something()
for directory, dirs, files in os.walk(directory_2):
do_something()
do tego kodu:
for directory, dirs, files in os.walk(directory_1) + os.walk(directory_2):
do_something()
Dostaję błąd:
nieobsługiwane typy operandów dla +: „generator” i „generator”
Jak połączyć dwa generatory w Pythonie?
Odpowiedzi:
Myślę, że
itertools.chain()
powinienem to zrobić.źródło
itertools.chain()
nie zwracatypes.GeneratorType
instancji. Na wszelki wypadek dokładny typ ma kluczowe znaczenie.Przykład kodu:
źródło
itertools.chain()
odpowiedzi?W Pythonie (3.5 lub nowszym) możesz:
źródło
def chain(*iterables): for iterable in iterables: yield from iterable
( Po uruchomieniudef
for
a
Sprawdzane jest tylko, dopóki wszystko z niegob
nie zostanie wydobyte , nawet jeśli nie jest iteratorem. To,TypeError
żeb
nie jest iteratorem, pojawi się później.Prosty przykład:
źródło
itertools.chain()
odpowiedzi?itertools.chain
zwraca iterator, a nie generator.chain([1, 2, 3], [3, 4, 5])
?Dzięki itertools.chain.from_iterable możesz wykonywać następujące czynności:
źródło
genny
gdy już zwraca generator.list(itertools.chain.from_iterable(genny(x)))
jest o wiele bardziej zwięzłe.list
konstruktor będzie znacznie bardziej czytelny niż zrozumienie listy. Pod tym względem twoja metoda jest znacznie bardziej nieczytelna.Tutaj używa wyrażenia generatorowego z zagnieżdżonymi
for
s:źródło
Można również użyć operatora rozpakowania
*
:UWAGA: Działa najbardziej wydajnie w przypadku iteratorów „nie leniwych”. Może być również używany z różnymi rodzajami rozumienia. Preferowanym sposobem dla konkat generatora będzie odpowiedź z @Uduse
źródło
Jeśli chcesz oddzielić generatory, ale jednocześnie iterować nad nimi, możesz użyć zip ():
UWAGA: Iteracja zatrzymuje się na krótszym z dwóch generatorów
Na przykład:
źródło
Powiedzmy, że musimy generatory (gen1 i gen 2) i chcemy wykonać dodatkowe obliczenia, które wymagają wyniku obu. Możemy zwrócić wynik takiej funkcji / obliczenia za pomocą metody map, która z kolei zwraca generator, który możemy zapętlić.
W tym scenariuszu funkcję / obliczenia należy zaimplementować za pomocą funkcji lambda. Najtrudniejszą częścią jest to, co chcemy zrobić wewnątrz mapy i jej funkcji lambda.
Ogólna forma proponowanego rozwiązania:
źródło
Wszystkie te skomplikowane rozwiązania ...
po prostu zrób:
Jeśli naprawdę chcesz „połączyć” oba generatory, wykonaj następujące czynności:
źródło
Powiedziałbym, że jak sugeruje w komentarzach użytkownika „wjandrea”, najlepszym rozwiązaniem jest
Nie zmienia zwracanego typu i jest naprawdę pythoniczny.
źródło