views:

369

answers:

3

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 better way to break the double loop?

+1  A: 

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/

dkamins
+3  A: 

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 
gnibbler
+1  A: 

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.combinations1 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.

magcius
I think you mean `itertools.product`. `combinations` produces n-length tuples from a single sequence
Jimmy
I think you mean `itertools.product`
gnibbler
oh bah.... I'm an idiot tonight.
magcius