44

次の方法を使用して、Pythonの二重ループを解除します。

for word1 in buf1:
    find = False
    for word2 in buf2:
        ...
        if res == res1:
            print "BINGO " + word1 + ":" + word2
            find = True
    if find:
        break

ダブルループを壊すより良い方法はありますか?

4

4 に答える 4

58

おそらくあなたが望んでいるものではありませんが、break通常findTrue

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 
于 2010-04-08T03:13:41.657 に答える
55

ネストされたループを壊すための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 
于 2010-12-29T11:06:31.430 に答える
14

関数を使用してリファクタリングし、「ビンゴ」を見つけたときに戻ることができるようにします。

ネストされたループの明示的な分割を許可する提案は拒否されました: http ://www.python.org/dev/peps/pep-3136/

于 2010-04-08T02:13:25.013 に答える
13

ほとんどの場合、いくつかの方法を使用して、二重ループと同じことを行う単一ループを作成できます。

この例では、itertools.productを使用して、コードスニペットを次のように置き換えることができます。

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

他のitertools関数は、他のパターンにも適しています。

于 2010-04-08T03:15:15.340 に答える