2016-01-11 7 views
5

Ich weiß, dass es furchtbar ineffizienter und hässlicher Code ist, aber wenn ich drei for Schleifen habe, ineinander geschachtelt wie:Mehrere verschachtelte "for" -Schleifen, weiter zur nächsten Iteration der äußeren Schleife, wenn die Bedingung innerhalb der inneren Schleife wahr ist

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

ich möchte die beiden inneren Schleifen zu durchbrechen und auf die nächste Iteration der äußeren Schleife fortgesetzt werden, wenn die if Aussage wahr ist. Kann das gemacht werden?

+0

AFAIK der Python Gründer ein Konstrukt hinzuzufügen verweigert, das zu tun, weil der Code würde hässlich – wil93

+3

Mögliche Duplikate von [Wie aus mehreren Schleifen in Python auszubrechen?] (http://stackoverflow.com/questions/189645/how-to-break-out-of-multiple-loops-in-python) – wil93

+1

Sie könnte es schreiben mit Variablen zu speichern Zustand und testen Sie jedes Mal, wenn Sie die Schleife brechen/beenden – beoliver

Antwort

4

prüfen einige Variable nach jedem Schleifen endet:

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

Eine weitere Option ist Ausnahmen anstelle von Zustandsvariablen zu verwenden:

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 

Ich stelle mir dies besonders nützlich sein könnte, wenn die Rettung von mehr als zwei inneren Schleifen.

0

Eine mögliche Lösung ist, die beiden inneren Schleifen auf ein einziges zu fusionieren (das mit break beendet werden kann):

import itertools 

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