多维排列

时间:2019-07-03 12:21:29

标签: python permutation

给出了一个非零整数列表,例如[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

3 个答案:

答案 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

不是元组列表,但您知道了...