Python 避免嵌套for循环

Python 避免嵌套for循环,python,for-loop,Python,For Loop,我正在尝试使用python对另一个代码进行一些参数测试。我需要测试6个独立的参数,但我需要它们的所有可能组合 每个参数都有一个最小值、一个最大值和一个需要传递给它的步长值。我脑海中浮现的第一个简单的解决方案是一个嵌套的for循环结构,看起来很可怕,如下所示: for var1 in xrange(min1,max1,step1): for var2 in xrange(min2,max2,step2): ... ...

我正在尝试使用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
                        '''
我决定,不!这是站不住脚的。所以我一直在努力找到一种递归的方法,或者至少不嵌套六次。我真的想不出一个好办法来这样做。对我来说,最大的障碍是每个变量都有不同的最小值、最大值和步长值

到目前为止,我的想法没有多大帮助。我一直试图使一些递归函数工作,但如果不在函数中嵌套更多for循环,我就无法理解它。我在这里看到了很多关于itertools.product的参考资料,但我也不太明白如何让它起作用


编辑:我正在做的是创建一个以参数组合命名的目录,用这些参数编写一个文件,用这个文件运行另一个代码,并分析该代码的输出。除了最后一个循环外,我在任何for循环中都没有做任何事情。很多参数只有2个值,有些有10个,有些有3个。。。它只是有点不同。

您可能可以使用
itertools.product

差不多

for var1, var2 in itertools.product(xrange(min1, max1, step1), xrange(min2, max2, step2)):
    # stuff

。只有六个变量都在那里。

以下是如何使用
产品的方法:

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(....)

在所有这些循环中实际应该做什么?我认为这是最重要的问题——有一些语法糖类可以隐藏循环(但仍在执行它们),但为了避免嵌套循环,最重要的是理解原始循环problem@deathApril是正确的:我已经给了您一种避免下面循环的方法,但是您仍然需要进行所有这些迭代。最好是使用不同的算法来避免迭代。添加了一个编辑来解释为什么我需要它。重点不是使用或不使用for循环;更重要的是,您可能不了解测试用例的数量增长有多快。6个设置,每个都有10个可能的值,是一百万个测试用例。我看到itertools.product解决了您的问题。真为你高兴。当您发现显式嵌套for循环和执行嵌套循环的隐藏C代码之间的性能差异可能非常大时,请不要感到惊讶;)附言:事实上,如果你发布了性能测试结果,那就太好了:)太好了!我正要问一个关于如何做到这一点的问题!您可以通过将
v1、v2、v3…
替换为
args
来简化此过程,然后执行
icky\u thing(*args)