Break the nested (double) loop in Python [duplicate]
-
25-09-2019 - |
Question
This question already has an answer here:
- How to break out of multiple loops? 29 answers
I use the following method to break the double loop in Python.
for word1 in buf1:
find = False
for word2 in buf2:
...
if res == res1:
print "BINGO " + word1 + ":" + word2
find = True
if find:
break
Is there a better way to break the double loop?
Solution
Probably not what you are hoping for, but usually you would want to have a break
after setting find
to 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
Another way is to use a generator expression to squash the for
into a single loop
for word1, word2 in ((w1, w2) for w1 in buf1 for w2 in buf2):
...
if res == res1:
print "BINGO " + word1 + ":" + word2
break
You may also consider using itertools.product
from itertools import product
for word1, word2 in product(buf1, buf2):
...
if res == res1:
print "BINGO " + word1 + ":" + word2
break
OTHER TIPS
The recommended way in Python for breaking nested loops is... Exception
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
Most times you can use a number of methods to make a single loop that does the same thing as a double loop.
In your example, you can use itertools.product to replace your code snippet with
import itertools
for word1, word2 in itertools.product(buf1, buf2):
if word1 == word2:
print "BINGO " + word1 + ":" + word2
break
The other itertools functions are good for other patterns too.
Refactor using functions so you can return when you find your "bingo".
The proposal to allow explicit breaking out of nested loops has been rejected: http://www.python.org/dev/peps/pep-3136/