使用此代码:
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
参数的问题,如上例所示。
请原谅我这个烂摊子! :)
答案 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
...