Разорвать вложенный (двойной) цикл в Python [дубликат]


На этот вопрос уже есть ответ здесь:

Я использую следующий метод, чтобы разорвать двойной цикл в Python.

for word1 in buf1:
    find = False
    for word2 in buf2:
        ...
        if res == res1:
            print "BINGO " + word1 + ":" + word2
            find = True
    if find:
        break
Есть ли лучший способ разорвать двойной цикл?
4 31

4 ответа:

Вероятно, не то, на что вы надеетесь, но обычно вы хотели бы иметь break после установки find в 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 

Другой способ-использовать выражение генератора, чтобы скомкать for в один цикл

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

Вы также можете рассмотреть возможность использования itertools.product

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

Рекомендуемый способ в Python для разрыва вложенных циклов... Исключение

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 

В большинстве случаев вы можете использовать несколько методов, чтобы сделать один цикл, который делает то же самое, что и двойной цикл.

В вашем примере вы можете использовать itertools.продукт для замены фрагмента кода на

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

Другие функции itertools хороши и для других шаблонов.

Рефактор с использованием функций, чтобы вы могли вернуться, когда найдете свой "Бинго".

Предложение разрешить явный разрыв вложенных циклов было отклонено.: http://www.python.org/dev/peps/pep-3136/