Разорвать вложенный (двойной) цикл в Python [дубликат]
На этот вопрос уже есть ответ здесь:
- Как вырваться из нескольких циклов в Python? 28 ответов
Я использую следующий метод, чтобы разорвать двойной цикл в Python.
for word1 in buf1:
find = False
for word2 in buf2:
...
if res == res1:
print "BINGO " + word1 + ":" + word2
find = True
if find:
break
Есть ли лучший способ разорвать двойной цикл?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/