我有一个列表的一些排列:
>>> import itertools
>>> perms = list(itertools.permutations([0,1,2,3]))
>>> perms
[(0, 1, 2, 3), (0, 1, 3, 2), (0, 2, 1, 3), (0, 2, 3, 1), (0, 3, 1, 2), (0, 3, 2, 1), (1, 0, 2, 3), (1, 0, 3, 2), (1, 2, 0, 3), (1, 2, 3, 0), (1, 3, 0, 2), (1, 3, 2, 0), (2, 0, 1, 3), (2, 0, 3, 1), (2, 1, 0, 3), (2, 1, 3, 0), (2, 3, 0, 1), (2, 3, 1, 0), (3, 0, 1, 2), (3, 0, 2, 1), (3, 1, 0, 2), (3, 1, 2, 0), (3, 2, 0, 1), (3, 2, 1, 0)]
>>> len(perms)
24
我可以使用什么函数(无需访问列表 perm
)来获取任意排列的索引,例如(0, 2, 3, 1)
-> 3
?
(您可以假设置换元素始终是整数的升序列表,从零开始。)
提示:可能涉及阶乘数系统。 https://en.wikipedia.org/wiki/Factorial_number_system
最佳答案
我突然想到了以下内容,但没有对其进行彻底测试。
from math import factorial
elements = list(range(4))
permutation = (3, 2, 1, 0)
index = 0
nf = factorial(len(elements))
for n in permutation:
nf //= len(elements)
index += elements.index(n) * nf
elements.remove(n)
print(index)
编辑:将 nf/= len(elements)
替换为 nf//= len(elements)
关于Python,排列到排列索引函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61656230/