我正在尝试使用python对另一个代码进行一些参数测试。我需要测试6个独立的参数,但我需要它们的所有可能组合。
每个参数都有一个最小值,一个最大值和一个需要传递给它的步长值。突然出现在我脑海中的第一个简单的解决方案是嵌套的for循环结构,看起来很可怕,如下所示:
for var1 in xrange(min1,max1,step1):
for var2 in xrange(min2,max2,step2):
...
...
...
for var6 in xrange(min6,max6,step6):
'''
Do something and be icky in the process due
to being in the middle of six nested for loops
'''
我决定了,不!这不能成立。所以我一直试图找到一种方法来递归地执行此操作,或者至少,不是嵌套六次。我无法真正想出一个好方案。对我来说最大的障碍是每个变量都有不同的最小值,最大值和步长值。
到目前为止,我的想法并不是很有帮助。我一直在尝试使一些递归函数工作,但是如果没有在函数中嵌套更多的循环,我就无法弄明白。我在这里看到了很多关于itertools.product的引用,但是我无法弄清楚如何使这个工作。
编辑:我正在做的是创建一个以参数组合命名的目录,使用这些参数编写文件,使用此文件运行另一个代码,以及分析该代码的输出。除了最后一个,我几乎没有在for循环中做任何事情。很多参数只有2个值,有些有10个,有些有3个...它只是有点不同。
答案 0 :(得分:42)
以下是product
:
x1 = xrange(min1,max1,step1)
x2 = xrange(min2,max2,step2)
x3 = xrange(min3,max3,step3)
...
for v1, v2, v3, v4, v5, v6 in itertools.product(x1, x2, x3, x4, x5, x6):
icky_thing(....)
或更紧凑:
ranges = [
xrange(min1,max1,step1),
xrange(min2,max2,step2),
xrange(min3,max3,step3),
...
]
for v1, v2, v3, v4, v5, v6 in itertools.product(*ranges):
icky_thing(....)
答案 1 :(得分:15)
您可以使用itertools.product
:http://docs.python.org/library/itertools.html#itertools.product。
像
这样的东西for var1, var2 in itertools.product(xrange(min1, max1, step1), xrange(min2, max2, step2)):
# stuff
。 。 。只有那里的所有六个变量。