Разбить вложенный (двойной) цикл в Python
Я использую следующий метод для разрыва двойного цикла в Python.
for word1 in buf1:
find = False
for word2 in buf2:
...
if res == res1:
print "BINGO " + word1 + ":" + word2
find = True
if find:
break
Есть ли лучший способ разбить двойной цикл?
Ответы
Ответ 1
Наверное, не то, на что вы надеетесь, но обычно вы должны иметь 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
Ответ 2
Рекомендуемый способ в 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
Ответ 3
В большинстве случаев вы можете использовать несколько методов для создания одного цикла, который делает то же самое, что и двойной цикл.
В вашем примере вы можете использовать itertools.product, чтобы заменить фрагмент кода
import itertools
for word1, word2 in itertools.product(buf1, buf2):
if word1 == word2:
print "BINGO " + word1 + ":" + word2
break
Другие функции itertools хороши и для других шаблонов.
Ответ 4
Рефактор использует функции, чтобы вы могли вернуться, когда найдете свое "бинго".
Предложение о разрешении явного выхода из вложенных циклов было отклонено:
http://www.python.org/dev/peps/pep-3136/