2016-03-15 74 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。
  • 最后,我使用切片来生成所有参数(列表的前缀)。