2016-01-11 20 views
5

So che è un codice terribilmente inefficiente e brutto, ma se ho tre loop for, annidati l'uno dentro l'altro in questo modo:Numerosi cicli "for" annidati, continuare l'iterazione successiva del ciclo esterno se la condizione all'interno del ciclo interno è vera

for x in range(0, 10): 
    for y in range(x+1, 11): 
     for z in range(y+1, 11): 
      if ... 

voglio rompere i due anelli interni e proseguire fino alla successiva iterazione del ciclo esterno se l'istruzione if è vero. Può essere fatto?

+0

AFAIK fondatore Python rifiutato di aggiungere un costrutto di farlo perché il codice diventerebbe brutto – wil93

+3

Possibile duplicato di [Come uscire da più loop in Python?] (http://stackoverflow.com/questions/189645/how-to-break-out-of-multiple-loops-in-python) – wil93

+1

tu potresti scriverlo usando le variabili per memorizzare lo stato e testare ogni volta che rompi/finisci il ciclo – beoliver

risposta

4

controllare alcune variabili dopo ogni loop si conclude:

for x in range(0, 10): 
    for y in range(x+1, 11): 
     for z in range(y+1, 11): 
      if condition: 
       variable = True 
       break 
      #... 
     if variable: 
      break; 
     #... 
1
n = False 
for x in range(0,10): 
    if n == True: 
     print(x,y,z) 
    for y in range(x+1, 11): 
     if n == True: 
      break 
     for z in range(y+1, 11): 
      if z == 5: 
       n = True 
       break 

(1, 2, 5) 
(2, 2, 5) 
(3, 3, 5) 
(4, 4, 5) 
(5, 5, 5) 
(6, 6, 5) 
(7, 7, 5) 
(8, 8, 5) 
(9, 9, 5) 
2

Un'altra opzione è quella di utilizzare le eccezioni al posto delle variabili di stato:

class BreakException(Exception): 
    pass 

for x in range(0, 10): 
    try: 
     for y in range(x+1, 11): 
      for z in range(y+1, 11): 
       if True: 
        raise BreakException 
    except BreakException: 
     pass 

Immagino che questo potrebbe essere particolarmente utile se mollo di più di due anelli interni.

0

Una possibile soluzione è quella di unire i due cicli interni ad uno solo (che può essere risolto con break):

import itertools 

for x in range(10): 
    for y, z in itertools.combinations(range(x+1, 11), 2): 
     if condition: 
      break