重构具有条件的几个嵌套for循环

时间:2016-03-15 10:39:40

标签: python refactoring

考虑以下代码

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整个三元组的值不能通过测试时,我不想进行昂贵的计算。

这段代码可以简化吗?如果我想添加更多内部循环(五个测试四个)会怎么样?

1 个答案:

答案 0 :(得分:0)

以下是使用CSVFieldMappingExceptionitertools进行切片的示例:

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