给出了一个非零整数列表,例如[2, 3, 4, 2]
生成所有可能排列的列表,其中上面的每个元素都反映了其最大方差(我敢肯定有一种更好的表达方式,但我没有数学背景);上述数组中的每个元素都可以视为一个维度;上述2将允许值为0和1; 3将允许值0、1和2,等等
结果将是从零开始的元组的列表:
[(0, 0, 0, 0), (0, 0, 0, 1), (0, 0, 1, 0), (0, 0, 1, 1), (0, 0, 2, 0)...
依次类推,直到(1, 2, 3, 1)]
数组的长度可以变化,从1个元素到x
答案 0 :(得分:3)
您可以使用itertools.product
:
尝试一下:
from itertools import product
limits = [2, 3, 4, 2]
result = list(product(*[range(x) for x in limits]))
print(result)
答案 1 :(得分:0)
您基本上要做的是尝试在变化的基数中表示整数。在您的示例中,某些数字是以2为底数,以3为底数,以4为底数。因此,您可以使用一种算法,将10乘以任何底数,并使转换的底数取决于当前数字。这就是我的想法,不确定是否完全清楚。
n = [2, 3, 4, 2]
max_val = 1
for i in n:
max_val *= i
ans = [] # will hold the generated lists
for i in range(max_val):
current_value = i
current_perm = []
for j in n[::-1]: # For you, the 'least significant bit' is on the right
current_perm.append(current_value % j)
current_value //= j # integer division in python 3
ans.append(current_perm[::-1]) # flip it back around!
print(ans)
答案 2 :(得分:0)
所以您基本上只想计数,但是每个位置都有不同的限制?
limits = [2,3,4,2]
counter = [0] * len(limits)
def check_limits():
for i in range(len(limits)-1, 0, -1):
if counter[i] >= limits[i]:
counter[i] = 0
counter[i-1] += 1
return not counter[0] >= limits[0]
while True:
counter[len(counter)-1] += 1
check = check_limits()
if check:
print(counter)
else:
break
不是元组列表,但您知道了...