2010-02-09 25 views
11

Necesito obtener el siguiente elemento del primer ciclo dado cierto estado, pero la condición está en el ciclo interno. ¿Hay una manera más corta de hacerlo que esto? (código de prueba)Python, próxima iteración del ciclo sobre un ciclo

ok = 0 
    for x in range(0,10): 
     if ok == 1: 
      ok = 0 
      continue 
     for y in range(0,20): 
      if y == 5: 
       ok = 1 
       continue 

¿Qué tal en esta situación?

for attribute in object1.__dict__: 
    object2 = self.getobject() 
    if object2 is not None: 
     for attribute2 in object2: 
      if attribute1 == attribute2: 
       # Do something 
       #Need the next item of the outer loop 

El segundo ejemplo muestra mejor mi situación actual. No quiero publicar el código original porque está en español. object1 y object2 son 2 objetos muy diferentes, uno es de naturaleza de mapeo relacional de objetos y el otro es un control web. Pero 2 de sus atributos tienen los mismos valores en ciertas situaciones, y debo pasar al siguiente elemento del ciclo externo.

+0

Parece 'NameError' –

Respuesta

7

Reemplace el continue en el lazo interno con un break. Lo que quiere hacer es salir del bucle interno, por lo que un continue hace lo contrario de lo que desea.

ok = 0 
for x in range(0,10): 
    print "x=",x 
    if ok == 1: 
     ok = 0 
     continue 
    for y in range(0,20): 
     print "y=",y 
     if y == 5: 
      ok = 1 
      break 
+0

cierto, mi error. pero aún necesito ver si puedo obtener el siguiente elemento del ciclo externo de una manera más simple :) – Pablo

+0

@Pablo: volver al ciclo externo inmediatamente es lo mismo que salir del ciclo interno, ¿no es así? ¿O quisiste decir algo más? – MAK

+0

@Pablo: supongo que quieres evitar el uso de 'break'. No creo que haya otra manera de volver al ciclo externo desde un bucle 'for'. La única forma en que viene a la mente es usar un bucle 'while' donde la condición de bucle comprueba la veracidad de un indicador. Esto es esencialmente lo que Ron sugirió, y puedes ejecutar fácilmente un ciclo while sobre un iterable como un bucle 'for' usando un' iterator' explícito. – MAK

2

siempre se puede transformar en un bucle while:

flag = False 
for x in range(0, 10): 
    if x == 4: 
     flag = True 
     continue 

convierte

x = 0 
while (x != 4) and x < 10: 
    x += 1 
flag = x < 10 

No es necesaria más simple, pero mejor en mi humilde opinión.

+0

Gracias, pero publiqué un mal ejemplo. En mi situación actual, estoy trabajando con objetos en lugar de números. – Pablo

2

Su código de ejemplo es equivalente a (eso no parece lo que quiere):

for x in range(0, 10, 2): 
    for y in range(20): 
     if y == 5: 
      continue 

Para saltar al siguiente elemento sin usar continue en el bucle externo:

it = iter(range(10)) 
for x in it: 
    for y in range(20): 
     if y == 5: 
      nextx = next(it) 
      continue 
0

¿Entonces no quieres algo como esto? Supongo que está pasando por las teclas de un diccionario, en lugar de los valores, siguiendo su ejemplo.

for i in range(len(object1.__dict__)): 
    attribute1 = objects1.__dict__.keys()[i] 
    object2 = self.getobject() # Huh? 
    if object2 is not None: 
    for j in range(len(object2.__dict__)): 
     if attribute1 == object2.__dict__.keys()[j]: 
     try: 
      nextattribute1 = object1.__dict__.keys()[i+1] 
     except IndexError: 
      print "Ran out of attributes in object1" 
      raise 
0

No es completamente claro para mí lo que quiera, pero si se está probando algo para cada elemento producido en el bucle interno, any podría ser lo que quiere (docs)

>>> def f(n): return n % 2 
... 
>>> for x in range(10): 
...  print 'x=', x 
...  if f(x): 
...   if any([y == 8 for y in range(x+2,10)]): 
...    print 'yes' 
... 
x= 0 
x= 1 
yes 
x= 2 
x= 3 
yes 
x= 4 
x= 5 
yes 
x= 6 
x= 7 
x= 8 
x= 9