2016-01-11 38 views
5

Wiem, że jest to okropnie nieefektywny i brzydki kod, ale jeśli mam trzy pętle for, zagnieżdżone w sobie nawzajem, takie jak:Kilka zagnieżdżonych pętli 'for', kontynuuj następną iterację pętli zewnętrznej, jeśli warunek wewnątrz pętli wewnętrznej jest prawdziwy

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

Chcę przełamać dwa wewnętrzne pętle i przejdź do następnej iteracji pętli zewnętrznej, jeżeli oświadczenie if jest prawdą. Czy można to zrobić?

+0

AFAIK twórcy Pythona odrzucone dodać konstrukt tego zrobić, ponieważ kod staną brzydki – wil93

+3

Możliwy duplikat [Jak wyrwać się z wielu pętli w Pythonie?] (http://stackoverflow.com/questions/189645/how-to-break-out-of-multiple-loops-in-python) – wil93

+1

ty może napisać to używając zmiennych do przechowywania stanu i testowania za każdym razem, gdy przerwiesz/zakończysz pętlę – beoliver

Odpowiedz

4

Sprawdź niektóre zmienne po każdej pętli kończy:

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

Inną opcją jest użycie wyjątków zamiast zmiennych Stan:

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 

sobie wyobrazić, co może być szczególnie przydatna w przypadku ratowania więcej niż dwóch wewnętrznych pętli.

0

Możliwym rozwiązaniem jest połączenie dwóch wewnętrznych pętli do tylko jednego (które mogą być zakończone break)

import itertools 

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