In Python können Sie mehrere Iteratoren in einem Listenverständnis haben, wie z
[(x,y) for x in a for y in b]
für einige geeignete Sequenzen a und b. Mir ist die Semantik verschachtelter Schleifen in Pythons Listenverständnis bekannt.
Meine Frage ist: Kann sich ein Iterator im Verständnis auf den anderen beziehen? Mit anderen Worten: Könnte ich so etwas haben:
[x for x in a for a in b]
Wo ist der aktuelle Wert der äußeren Schleife der Iterator der inneren?
Wenn ich beispielsweise eine verschachtelte Liste habe:
a=[[1,2],[3,4]]
Was wäre der Ausdruck für das Listenverständnis, um dieses Ergebnis zu erzielen:
[1,2,3,4]
?? (Bitte nur Verständnisantworten auflisten, da ich dies herausfinden möchte).
quelle
[x for b in a for x in b]
Dies hat immer über Python abgehört. Diese Syntax ist so rückwärts. Die allgemeine Form von hatx for x in y
immer die Variable direkt nach dem for, füttert den Ausdruck links vom for. Sobald Sie ein doppeltes Verständnis haben, ist Ihre zuletzt iterierte Variable plötzlich so weit. Es ist umständlich und liest sich überhaupt nicht natürlichIch hoffe das hilft jemand anderem, da
a,b,x,y
ich nicht viel Bedeutung habe! Angenommen, Sie haben einen Text voller Sätze und möchten eine Reihe von Wörtern.Ich stelle mir Listenverständnis gerne als horizontales Strecken von Code vor.
Versuchen Sie es in:
Beispiel:
Dies funktioniert auch für Generatoren
quelle
Ich glaube, ich habe die Antwort gefunden: Ich habe nicht genug darauf geachtet, welche Schleife innen und welche außen ist. Das Listenverständnis sollte wie folgt aussehen:
Um das gewünschte Ergebnis zu erhalten, und ja, kann ein aktueller Wert der Iterator für die nächste Schleife sein.
quelle
Die Reihenfolge der Iteratoren scheint möglicherweise nicht intuitiv zu sein.
Nehmen Sie zum Beispiel:
[str(x) for i in range(3) for x in foo(i)]
Zerlegen wir es:
quelle
[(output in loop 2) (loop 1) (loop 2)]
mit(loop 1) = for i in range(3)
und(loop 2) = for x in foo(i):
und(output in loop 2) = str(x)
.ThomasH hat bereits eine gute Antwort hinzugefügt, aber ich möchte zeigen, was passiert:
Ich denke, Python analysiert das Listenverständnis von links nach rechts. Dies bedeutet, dass die erste auftretende
for
Schleife zuerst ausgeführt wird.Das zweite "Problem" dabei ist, dass es
b
aus dem Listenverständnis "durchgesickert" wird. Nach dem ersten erfolgreichen Listenverständnisb == [3, 4]
.quelle
x = 'hello';
[x for x in xrange(1,5)];
print x # x is now 4
Wenn Sie das mehrdimensionale Array beibehalten möchten, sollten Sie die Array-Klammern verschachteln. Siehe Beispiel unten, in dem jedem Element eines hinzugefügt wird.
quelle
Diese Speichertechnik hilft mir sehr:
[ <RETURNED_VALUE> <OUTER_LOOP1> <INNER_LOOP2> <INNER_LOOP3> ... <OPTIONAL_IF> ]
Und jetzt können Sie sich R eturn + O uter-loop als den einzigen R ight O rder vorstellen
Wie oben bekannt, scheint die Reihenfolge in der Liste, die auch für 3 Schleifen umfassend ist, einfach zu sein:
weil das obige nur ein:
Für die Iteration einer verschachtelten Liste / Struktur ist die Technik dieselbe: für
a
aus der Frage:für einander verschachtelte Ebene
und so weiter
quelle
Ich denke, das ist leichter zu verstehen
quelle
Darüber hinaus können Sie für das Mitglied der Eingabeliste, auf das derzeit zugegriffen wird, und für das Element in diesem Element dieselbe Variable verwenden . Dies könnte es jedoch noch verständlicher machen.
Zuerst
for x in input
wird ausgewertet, was zu einer Mitgliederliste der Eingabe führt. Dann geht Python durch den zweiten Teil,for x in x
in dem der x-Wert durch das aktuelle Element, auf das zugegriffen wird, überschrieben wird. Dannx
definiert der erste, was wir zurückgeben möchten.quelle
Diese Funktion flatten_nlevel ruft die verschachtelte Liste1 rekursiv auf, um sie auf eine Ebene zu verbergen. Probieren Sie es aus
Ausgabe:
quelle
flatten_nlevel(sublist, flat_list)
, oder?!