2010-04-08 14 views

Odpowiedz

36

Prawdopodobnie nie co masz nadzieję na, ale zwykle co chcesz mieć break po ustawieniu find do True

for word1 in buf1: 
    find = False 
    for word2 in buf2: 
     ... 
     if res == res1: 
      print "BINGO " + word1 + ":" + word2 
      find = True 
      break    # <-- break here too 
    if find: 
     break 

Innym sposobem jest użycie wyrażenia generatora do zgniecenia for w jedną pętlę

for word1, word2 in ((w1, w2) for w1 in buf1 for w2 in buf2): 
    ... 
    if res == res1: 
     print "BINGO " + word1 + ":" + word2 
     break 

Można również rozważyć użycie itertools.product

from itertools import product 
for word1, word2 in product(buf1, buf2): 
    ... 
    if res == res1: 
     print "BINGO " + word1 + ":" + word2 
     break 
+1

+1 proste, ale eleganckie! –

+0

itertools.product() to świetne podejście. –

+0

Dowiedziałem się czegoś dzisiaj :) – wonzbak

5

Refaktor za pomocą funkcji, dzięki czemu można wrócić, gdy znajdziesz swoje "bingo".

Propozycja, aby umożliwić wyraźne wyrwanie się z zagnieżdżonych pętli została odrzucona: http://www.python.org/dev/peps/pep-3136/

+1

Powinno to być górna głosowało odpowiedź IMO. –

9

większość czasu można korzystać z wielu metod, aby wykonać jedną pętlę, która robi to samo, co podwójną pętlę.

W przykładzie, można użyć itertools.product zastąpić fragment kodu z

import itertools 
for word1, word2 in itertools.product(buf1, buf2): 
    if word1 == word2: 
     print "BINGO " + word1 + ":" + word2 
     break 

Pozostałe funkcje itertools są dobre dla innych wzorów też.

+0

Myślę, że masz na myśli 'itertools.product'. 'combination' tworzy krotki o długości n z pojedynczej sekwencji – Jimmy

+0

Myślę, że masz na myśli' itertools.product' –

+0

oh bah .... Dzisiaj jestem idiotą. – magcius

29

Zalecanym sposobem w Pythonie za złamanie zagnieżdżone pętle to ... Wyjątek

class Found(Exception): pass 
try: 
    for i in range(100): 
     for j in range(1000): 
      for k in range(10000): 
       if i + j + k == 777: 
        raise Found 
except Found: 
    print i, j, k 
+2

Naprawdę? Nigdy nie widziałem wyjątków zalecanych do niczego oprócz wyjątkowych rzeczy. – dave

+10

Naprawdę, Python ma nieco inne podejście do wyjątków, a to użycie jest OK. – Guard

+0

Podoba mi się ten pomysł, ponieważ obejmuje on również sytuacje, w których trzeba powtórzyć dwuwymiarową listę z zagnieżdżonymi pętlami. Niektóre inne pomysły nie działają w tym przypadku, ponieważ zagnieżdżona pętla for wykorzystuje zmienną dostarczoną przez macierzystą pętlę dla uzyskania więcej niż jednego elementu do iterowania. – Shule