2010-04-08 121 views
30

我使用以下方法打破Python中的雙循環。在Python中打破嵌套(雙)循環

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

有沒有更好的方法來打破雙循環?

回答

36

你希望也許不是什麼,但通常你會希望有一個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 
+1

+1簡單而優雅! – 2012-08-13 23:06:54

+0

itertools.product()是一個很好的方法。 – 2016-02-27 00:22:22

+0

我今天學到了一些東西:) – wonzbak 2017-06-12 12:44:51

5

使用函數進行重構,以便在找到「賓果」時返回。

允許明確突破嵌套循環的提案已被否決: http://www.python.org/dev/peps/pep-3136/

+1

這應該是上投答案海事組織。 – 2018-01-14 18:04:00

9

大多數時候,你可以用多種方法使單個環路,做同樣的事,作爲一個雙循環。

在您的例子,你可以使用itertools.product

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

更換您的代碼段的其他itertools功能有利於其他模式了。

+0

我想你的意思是'itertools.product'。 '組合'從單個序列產生n長度的元組 – Jimmy 2010-04-08 03:19:39

+0

我認爲你的意思是'itertools.product' – 2010-04-08 03:19:48

+0

哦b ....今晚我是個白癡。 – magcius 2010-04-08 03:23:35

29

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 
+2

真的嗎?除了特殊的事情外,我從來沒有看到任何異常。 – dave 2010-12-29 13:47:08

+10

真的,Python有一些不同的方法來處理異常,這種用法是可以的。 – Guard 2010-12-29 13:55:19

+0

我喜歡這個想法,因爲它也涵蓋了需要迭代嵌套for循環的二維列表的情況。其他一些想法不適用於此,因爲嵌套for循環使用父循環提供的變量來獲取多個項目進行迭代。 – Shule 2014-05-23 22:06:40