Python中的多个for循环,具有可变范围和可变数量的循环

时间:2016-06-17 13:27:38

标签: python

使用此代码:

from itertools import product

for a, b, c, d in product(range(low, high), repeat=4):
    print (a, b, c, d)

我有这样的输出:

0 0 0 0
0 0 0 1
0 0 0 2
0 0 1 0
0 0 1 1
0 0 1 2
0 0 2 0
0 0 2 1
0 0 2 2

但是如何创建一个能够实现此目的的算法:

0 0 0 0
0 0 0 1
0 0 0 2
0 0 0 3
0 0 0 4
0 0 1 1
0 0 1 2
0 0 1 3
0 0 1 4
0 0 2 2
0 0 2 3
0 0 2 4
0 0 3 3
0 0 3 4
0 0 4 4

更重要的是:每列输出必须具有不同的范围,例如:第一列:0-4第二列:0-10等 列数(a,b,c,d)不固定;取决于程序的其他部分,可以在2到200的范围内。

更新:更易于理解和清晰

我需要的是这样的东西:

for a in range (0,10):
    for b in range (a,10):
        for c in range (b,10):
             for d in range (c,10):
                 print(a,b,c,d)

问题已得到部分解决,但仍然存在如何更改range参数的问题,如上例所示。 请原谅我这个烂摊子! :)

2 个答案:

答案 0 :(得分:4)

itertools.product已经可以完全按照您的要求进行操作,只需将其传递给多个迭代(在这种情况下是您想要的范围)。它将从每个可传递的迭代中收集一个元素。例如:

for a,b,c in product(range(2), range(3), range(4)):
    print (a,b,c)

<强>输出

0 0 0
0 0 1
0 0 2
0 0 3
0 1 0
0 1 1
0 1 2
0 1 3
0 2 0
0 2 1
0 2 2
0 2 3
1 0 0
1 0 1
1 0 2
1 0 3
1 1 0
1 1 1
1 1 2
1 1 3
1 2 0
1 2 1
1 2 2
1 2 3

如果您的输入范围是可变的,只需将循环放在一个函数中并使用不同的参数调用它。你也可以使用

的内容
for elements in product(*(range(i) for i in [1,2,3,4])):
    print(*elements)

如果你有大量的输入迭代。

对于变量范围的更新请求,itertools.product的一个很好的短路方法并不是那么清楚,尽管你总是可以检查每个迭代是按升序排序的(因为这基本上是你的变量范围确保)。根据你的例子:

for elements in product(*(range(i) for i in [10,10,10,10])):
    if all(elements[i] <= elements[i+1] for i in range(len(elements)-1)):
        print(*elements)

答案 1 :(得分:2)

你在找这样的东西吗?

# the program would modify these variables below
column1_max = 2
column2_max = 3
column3_max = 4
column4_max = 5

# now generate the list
for a in range(column1_max+1):
    for b in range(column2_max+1):
        for c in range(column3_max+1):
            for d in range(column4_max+1):
                if c>d or b>c or a>b:
                    pass
                else:
                    print a,b,c,d

输出:

0 0 0 0
0 0 0 1
0 0 0 2
0 0 0 3
0 0 0 4
0 0 0 5
0 0 1 1
0 0 1 2
0 0 1 3
0 0 1 4
0 0 1 5
0 0 2 2
0 0 2 3
0 0 2 4
0 0 2 5
0 0 3 3
0 0 3 4
0 0 3 5
0 0 4 4
0 0 4 5
0 1 1 1
0 1 1 2
...
相关问题