2013-02-12 23 views
29

Jak można continue utworzyć pętlę nadrzędną dwóch pętli zagnieżdżonych w Pythonie?Jak kontynuować w zagnieżdżonych pętlach w Pythonie

for a in b: 
    for c in d: 
     for e in f: 
      if somecondition: 
       <continue the for a in b loop?> 

Wiem, że można tego uniknąć w większości przypadków, ale czy można to zrobić w Pythonie?

+1

żadnego powodu, aby nie wystarczy użyć 'break'? –

+0

Użyj 'break', aby opuścić wewnętrzną pętlę - to będzie natychmiast kontynuowane w zewnętrznej pętli. – TyrantWave

+2

Jest jeszcze jedno podobne pytanie: http://stackoverflow.com/questions/189645/how-to-break-out-of-multiple-loops-in-python – esycat

Odpowiedz

29
  1. przerwę od wewnętrznej pętli (jeśli nie ma nic innego po nim)
  2. Put ciała zewnętrznej pętli w funkcja i zwrot z funkcji Podnieś wyjątek i złap go na poziomie zewnętrznym. Ustaw flagę, zerwanie z pętli wewnętrznej i przetestuj ją na poziomie zewnętrznym.
  3. Skoryguj kod, dzięki czemu nie musisz już tego robić.

Pobierałbym po 5 za każdym razem.

+3

6. użyj itertools :) –

+2

@gnibbler, w ogólnym przypadku # 6 ⊂ # 5 ale dla tego konkretnego przypadku dam +1 twoją odpowiedź – Duncan

1

użyć break wyrwać się z pętli wewnętrznej i kontynuować rodzica

for a in b: 
    for c in d: 
     if somecondition: 
      break // go back to parent loop 
12

Oto garść hacky sposobów, aby to zrobić:

  1. utworzyć lokalną funkcję

    for a in b: 
        def doWork(): 
         for c in d: 
          for e in f: 
           if somecondition: 
            return # <continue the for a in b loop?> 
        doWork() 
    

    Lepszym rozwiązaniem byłoby przenieść DoWork gdzieś indziej i przekazać swój stan jako argumenty.

  2. Użyj wyjątek

    class StopLookingForThings(Exception): pass 
    
    for a in b: 
        try: 
         for c in d: 
          for e in f: 
           if somecondition: 
            raise StopLookingForThings() 
        except StopLookingForThings: 
         pass 
    
9
from itertools import product 
for a in b: 
    for c, e in product(d, f): 
     if somecondition: 
      break 
Powiązane problemy