2016-03-15 72 views
3

考慮下面的代碼段重構幾個嵌套for循環的條件

for a in generator1(): 
    if test(a): 
     for b in generator2(): 
      if test(a, b): 
       for c in generator3(): 
        if test(a, b, c): 
         print "Found {} {} {}".format(a, b, c) 

使用test之前每個循環是必要的,因爲發電機可以產生大量的值(10^6-10^8)。我不想做昂貴的計算,當清楚由於價值ab整個三倍將不能通過測試。

這段代碼可以簡化嗎?如果我想添加更多的內部循環(五個測試四)?

+0

使用列表。例如:'generators = [generator1,generator2]';並用列表調用測試:'args = [a] test(args)... args + = [b] test(args)' – nikniknik2016

+0

@ nikniknik2016請您詳細說明一下嗎? –

+0

我可能會把它寫成遞歸生成器 –

回答

0

下面是使用itertoolsall與切片的例子:

ag = range(10) 
bg = range(10) 
cg = range(10) 

import itertools 

# only returns true if all numbers are equal 
def test(args): 
    return len(set(args)) <= 1 

for comb in itertools.product(ag, bg, cg): 
    if all(test(comb[:limit]) for limit in range(len(comb) + 1)): 
     print "found", comb 
  • itertools產生髮電機的所有組合。
  • all被用來代替您的if s。
  • 最後,我使用切片來生成所有參數(列表的前綴)。