2010-03-12 9 views
19

Ich habe mich gefragt, wie die folgende in Python zu erreichen:Python for-Schleife Frage

for(int i = 0; cond...; i++) 
    if cond... 
    i++; //to skip an run-through 

Ich habe versucht, dies ohne Glück.

for i in range(whatever): 
    if cond... : 
    i += 1 
+0

Whoops. Ich wollte dem anderen ein Duplikat geben. Das tut mir leid. –

Antwort

28

Python für Schleifen sind anders. i wird jedes Mal durch die Schleife dem nächsten Wert zugewiesen.

Im Folgenden wird das tun, was Sie wollen, weil es die wörtliche Version dessen, was C++ zu tun ist, ist unter:

i = 0 
while i < some_value: 
    if cond...: 
     i+=1 
    ...code... 
    i+=1 

Hier ist der Grund:

in C++, die folgenden Codesegmente äquivalent sind:

for(..a..; ..b..; ..c..) { 
    ...code... 
} 

und

..a.. 
while(..b..) { 
    ..code.. 
    ..c.. 
} 

während die Python for-Schleife sieht ungefähr so ​​aus:

for x in ..a..: 
    ..code.. 

verwandelt sich in

my_iter = iter(..a..) 
while (my_iter is not empty): 
    x = my_iter.next() 
    ..code.. 
9

Es gibt ein continue Schlüsselwort, das die aktuelle Iteration überspringt und geht dann zu dem nächsten (und einem break Schlüsselwort, das alle Iterationen Schleife überspringt und verläßt die Schleife):

for i in range(10): 
    if i % 2 == 0: 
     # skip even numbers 
     continue 
    print i 
+4

Ihr Konzept ist korrekt, aber Ihre Formulierung ist falsch. Continue überspringt nicht die nächste Iteration, es geht zur nächsten Iteration –

+0

thx, Sie haben Recht;) – tux21b

+0

Alles klar, aber was wäre, wenn ich die nächsten 5 Durchläufe überspringen wollte. Ich meinte, ist es möglich, "i" manuell zu erhöhen? –

0

Sie können nicht trivial „um die nächste Etappe überspringen“ (Sie natürlich dieses Bein mit einem überspringen continue). Wenn Sie wirklich darauf bestehen, können Sie es mit einem Hilfs bool, z.

skipping = False 
for i in whatever: 
    if skipping: 
    skipping = False 
    continue 
    skipping = cond 
    ... 

oder für Allgemeinheit mit einem Hilfs int:

skipping = 0 
for i in whatever: 
    if skipping: 
    skipping -= 1 
    continue 
    if badcond: 
    skipping = 5 # skip 5 legs 
    ... 

aber es wäre besser, solche komplexe Looping Logik in einem geeigneten Generator zu kapseln - harten Beispiele zu geben, wenn Sie ein bisschen sein können konkreter über das, was Sie wollen (das "Pseudo-C" mit zwei vermutlich 100% verschiedenen Verwendungen des gleichen Booleschen cond ist wirklich schwer zu folgen ;-).

4

Denken Sie daran, dass Sie über die Elemente in der Liste iterieren und nicht über eine Zahl iterieren.

Zum Beispiel ist folgende zu beachten:

for i in ["cat", "dog"]: 
    print i 

Was würde passieren, wenn Sie i + 1 es getan haben? Sie können jetzt sehen, warum das nächste Element in der Liste nicht übersprungen wird.

Anstatt tatsächlich über alle Werte zu iterieren, könnten Sie versuchen, anzupassen, was in der Liste enthalten ist, über die Sie iterieren.

Beispiel:

r = range(10) 
for i in filter(lambda x: x % 2 == 0, r): 
    print i 

Sie können auch die für den Körper in 2. Der erste Teil auf das nächste Element Zerschlagung betrachten überspringen wird continue durch die Verwendung und der zweite Teil wird die Aktion tun, wenn Sie nicht taten überspringen.

4

Sie können den Iterator explizit inkrementieren.

whatever = iter(whatever) 
for i in whatever: 
    if cond: 
     whatever.next() 

Sie müssen StopIteration abfangen, wenn cond für das letzte Element True sein kann.

0
for i in filter(lambda x:x!=2,range(5)): 
2

Je nach der Aufgabe, die Sie ausführen möchten, gibt es einen alternativen Ansatz. Wenn cond vollständig eine Funktion der Eingangsdaten ist, dass Sie Schleifen über, könnten Sie so etwas wie die folgenden versuchen:

def check_cond(item): 
    if item satisfies cond: 
     return True 
    return False 

for item in filter(check_cond, list): 
    ... 

Dies ist die funktionale Programmierung Art und Weise, dies zu tun, ein bisschen wie LINQ in C# 3.0 und höher. Ich bin mir nicht so sicher, dass es alles ist, was Pythonic (für eine Weile Guido van Rossum wollte Filter entfernen, Karte und reduzieren von Python 3), aber es ist sicherlich elegant und die Art, wie ich es tun würde.