Überspringen Iterationen in der Aufzählung-Objekt (python)
Ich habe den code
for iline, line in enumerate(lines):
...
if <condition>:
<skip 5 iterations>
Möchte ich, wie Sie Lesen können, haben die for-Schleife überspringen, 5 Iterationen, wenn die Bedingung erfüllt ist. Kann ich sicher sein, dass, wenn die Bedingung erfüllt ist, gibt es 5 oder mehr Objekte Links, die in der "Zeilen" - Objekt.
Linien besteht aus einer Reihe von Wörterbüchern, die geloopt werden, um
while
Schleife kann in diesem Fall effizienter, denke ich.- ich brauche die Nummer der iteration in der rest von meinem code, so wie würde ich es mit einer Weile?
- die
continue
Befehl verschiebt den loop zum nächsten durchsuchbar - das wird nur überspringen einer einzigen Zeile
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie Durchlaufen ein file-Objekt können Sie Zeilen überspringen mit " Nächster oder machen Zeilen, die ein iterator:
Es hängt wirklich davon ab, was Sie Durchlaufen und was Sie tun möchten.
Mit Ihrem eigenen code mit iter und islice:
itertools.islice
auf den iterator zu überspringen die Linien docs.python.org/2/library/itertools.html#itertools.isliceislice
tut, was Sie denken, es tut hier. Denken Sie daran, dass der iterator sich nicht kennen oder kümmern uns umiline
.Den standard-idiom, dies zu tun ist, um einen iterator, und verwenden Sie dann eine der Konsumgewohnheiten (siehe hier in der
itertools
docs.)Beispiel:
produziert
Als Padraic Cunningham Staaten, können Sie dies mit einer while-Schleife, können Sie auch ein Wörterbuch zu ersetzen, die der if-Anweisung:
Verwenden Sie ein externes flag und setzen es, wenn die Bedingung erfüllt ist, und überprüfen Sie es am Anfang des Zyklus:
Oder explizit-Extrakt 5-Elemente-von enumeration:
Ich persönlich bevorzuge den ersten Ansatz, aber die zweite sieht mehr Pythonic.
Könnten Sie einen funktionalen Programmierung Stil mit Rekursion, zuerst, indem Sie die benötigten Teile Ihres
for
Schleife in eine Funktion:Optional, wenn es nicht noch zu etwas zurückkehren, können Sie einfach passen Sie diese Zeilen von code, der eine Funktion aufruft, und das Ergebnis zurückgeben wird
None
.Dann einige Ort, den Sie tatsächlich nennen es:
Wenn Sie die Funktion zur Rückgabe etwas anders für jeden index, dann würde ich vorschlagen, ändern dies etwas zu berücksichtigen, für die output-Daten-Struktur, die Sie möchten. In diesem Fall möchten Sie vielleicht pass das innere Ergebnis
do_some_side_effects
zurück in die rekursive Funktion nennen, damit er bauen kann, bis das Ergebnis.Dann zu rufen
Beachten Sie, dass in Python, wegen der Art, wie die meisten der grundlegenden Datenstrukturen implementiert werden, dieser Programmierstil ist nicht zu gewinnen Sie Effizienz, und im Zusammenhang mit anderen Objekt-orientierten code, kann es auch schlechter Stil, um die Dinge zu komplizieren, die über die einfache
while
Lösung.Mein Rat: verwenden Sie die
while
Schleife, obwohl, ich würde dazu neigen, zu strukturieren, zu meinen Projekten und APIs, so dass mit einer rekursiven funktionale Ansatz noch effizienter und lesbar. Ich würde auch versuchen, nicht zu erlauben, Nebenwirkungen innerhalb der Schleife.Mit der Aufzählung index
Ähnlich wie die akzeptierte Antwort... außer, ohne mit
itertools
(IMHOislice
verbessert nicht die Lesbarkeit), plusenumerate()
gibt bereits einen iterator, so dass Sie nicht brauchen, dieiter()
an alle:Letzten Zeile kann Optional erweitert werden, für die Lesbarkeit:
Den
None
argument innext()
vermeidet eine Ausnahme, wenn es gibt nicht genug Elemente zu überspringen. (Für die ursprüngliche Frage, kann es weggelassen werden, wie der OP schrieb: "ich kann sicher sein, dass, wenn die Bedingung erfüllt ist, gibt es 5 oder mehr Objekte Links in derlines
Objekt.")Nicht mit der Aufzählung index
Wenn die skip-Zustand basiert nicht auf der index-enumeration, einfach behandeln Sie die Liste als eine FIFO-Warteschlange und konsumieren von es mit
pop()
:Wie vor, die Letzte Zeile kann Optional erweitert werden, für die Lesbarkeit:
(Für große Listen, verwenden
collections.deque
für Leistung.)