2010-03-12 15 views
19

me preguntaba cómo lograr lo siguiente en Python:Python para la pregunta de bucle

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

yo probamos este sin suerte.

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

Whoops. Quería votar el otro por duplicado. Lo siento por eso. –

Respuesta

28

Python de los bucles son diferente. i se reasigna al siguiente valor cada vez que pasa el ciclo.

A continuación se va a hacer lo que quiere, porque está tomando la versión literal de lo que C++ está haciendo:

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

He aquí por qué:

en C++, los siguientes segmentos de código son equivalentes:

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

y

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

mientras que la pitón para el bucle se ve algo como:

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

convierte en

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

No es una palabra clave continue la que se salta la iteración actual y avanza a la siguiente (y una palabra clave break la que se salta todas las iteraciones del bucle y sale del bucle):

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

Su concepto es correcto, pero su redacción es incorrecta. Continuar sin omitir la siguiente iteración, va a la siguiente iteración –

+0

thx, tiene razón;) – tux21b

+0

Muy bien, pero ¿qué sucede si quiero omitir las siguientes 5 correcciones? Quiero decir, ¿es posible aumentar "i" manualmente? –

0

No se puede trivialmente "saltar la siguiente etapa" (por supuesto puede omitir esta etapa con una continue). Si realmente insistes que puedes hacerlo con un auxiliar bool, p.

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

o para la generalidad con un auxiliar int:

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

Sin embargo, sería mejor para encapsular esa lógica en bucle compleja en un generador adecuado - difícil de dar ejemplos a menos que pueda ser un poco sin embargo, más concreta sobre lo que quiere (que "pseudo-C" con dos usos supuestamente 100% diferentes del mismo booleano cond es REALMENTE difícil de seguir ;-).

4

Recuerde que está iterando sobre los elementos de la lista y no iterando sobre un número.

Por ejemplo considere lo siguiente:

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

¿Qué pasaría si lo hiciera i + 1 no? Puede ver ahora por qué no omite el siguiente elemento en la lista.

En lugar de iterar sobre todos los valores, puede intentar ajustar lo que está dentro de la lista sobre la que está iterando.

Ejemplo:

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

También puede considerar la ruptura del cuerpo en para 2. La primera parte se saltará al siguiente elemento mediante el uso de continue, y la segunda parte va a hacer la acción si no lo hizo omitir.

4

Puede incrementar explícitamente el iterador.

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

Deberá capturar StopIteration si cond puede ser True en el último elemento.

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

Hay un enfoque alternativo para esto, dependiendo de la tarea que se intenta lograr. Si cond es del todo una función de los datos de entrada se recorre más, puede intentar algo como lo siguiente:

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

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

Ésta es la forma en la programación funcional para hacer esto, algo así como LINQ en C# 3.0 o superior. No estoy tan seguro de que sea tan pitónico (durante un tiempo Guido van Rossum quiso eliminar el filtro, el mapa y reducirlo de Python 3), pero ciertamente es elegante y de la manera en que lo haría.