Ich möchte den folgenden Code ändern
for directory, dirs, files in os.walk(directory_1):
do_something()
for directory, dirs, files in os.walk(directory_2):
do_something()
zu diesem Code:
for directory, dirs, files in os.walk(directory_1) + os.walk(directory_2):
do_something()
Ich bekomme den Fehler:
nicht unterstützte Operandentypen für +: 'Generator' und 'Generator'
Wie verbinde ich zwei Generatoren in Python?
Antworten:
Ich denke
itertools.chain()
sollte es tun.quelle
itertools.chain()
keinetypes.GeneratorType
Instanz zurückgibt. Nur für den Fall, dass der genaue Typ entscheidend ist.Ein Beispiel für Code:
quelle
itertools.chain()
Antwort hinzufügen ?In Python (3.5 oder höher) können Sie Folgendes tun:
quelle
def chain(*iterables): for iterable in iterables: yield from iterable
(Setzen Sie dasdef
undfor
in separate Zeilen, wenn Sie es ausführen.)a
wird geprüft, bis alles daraus ergibt, auch wennb
es sich nicht um einen Iterator handelt. Das,TypeError
weilb
ich kein Iterator bin, wird später auftauchen.Einfaches Beispiel:
quelle
itertools.chain()
Antwort hinzufügen ?itertools.chain
ein Iterator zurückgegeben wird, kein Generator.chain([1, 2, 3], [3, 4, 5])
?Mit itertools.chain.from_iterable können Sie Folgendes tun:
quelle
genny
wenn er bereits einen Generator zurückgibt.list(itertools.chain.from_iterable(genny(x)))
ist viel prägnanter.list
Konstruktor ist viel besser lesbar als das Listenverständnis. Ihre Methode ist in dieser Hinsicht viel unleserlicher.Hier wird ein Generatorausdruck mit verschachtelten
for
s verwendet:quelle
Man kann auch den Unpack-Operator verwenden
*
:HINWEIS: Funktioniert am effizientesten für nicht faule Iterables. Kann auch mit unterschiedlichen Verständnisweisen verwendet werden. Der bevorzugte Weg für Generator Concat wäre die Antwort von @Uduse
quelle
Wenn Sie die Generatoren getrennt halten und dennoch gleichzeitig durchlaufen möchten, können Sie zip () verwenden:
HINWEIS: Die Iteration stoppt am kürzeren der beiden Generatoren
Beispielsweise:
quelle
Nehmen wir an, wir müssen Generatoren (Gen1 und Gen2) und wir möchten eine zusätzliche Berechnung durchführen, die das Ergebnis von beiden erfordert. Wir können das Ergebnis einer solchen Funktion / Berechnung über die Map-Methode zurückgeben, die wiederum einen Generator zurückgibt, auf dem wir eine Schleife ausführen können.
In diesem Szenario muss die Funktion / Berechnung über die Lambda-Funktion implementiert werden. Der schwierige Teil ist das, was wir innerhalb der Karte und ihrer Lambda-Funktion erreichen wollen.
Allgemeine Form der vorgeschlagenen Lösung:
quelle
All diese komplizierten Lösungen ...
mach einfach:
Wenn Sie wirklich beide Generatoren "verbinden" möchten, gehen Sie wie folgt vor:
quelle