我如何找到可以重新排列数字序列(可能包含相似项目)的方式的数量,以便数字不会与它或相似数字放在同一位置。
例如,[0,0,0,1,1,1]
只能以一种方式重新排列,即 [1,1,1,0,0, 0]
。
[0,0,0,1,1,1,1]
不能以任何方式排列。
[1,2,2,14]
可以用两种方式排列,即 [2,1,14,2], [2,14,1,2]
.
[1,1,2,2,14]
可以用 4 种方式排列,即 [14,2,1,1,2], [2,2,14, 1,1], [2,2,1,14,1], [2,14,1,1,2]
。
数学解决方案可用,但我正在考虑使用编程概念的一些简单方法。数学代码有点像这样..(对不起,我无法以正确的格式发布)
∫∞0 Ln1(x)..Lnr(x)e−xdx
其中 r 是项目数,ni 是项目 i 的出现次数,Lk 是第 k 个拉盖尔多项式。例如,对于 1,1,2,2,14,我们有 r=3, n1=2, n2=2, n3=1,所以直到一个符号,重新排列的次数是
∫∞0 L2(x)L2(x)L1(x)e−xdx
= ∫∞0 12(x2−4x+2)12(x2−4x+2)(1−x)e−xdx
= ∫∞0(−14x5+94x4−7x3+9x2−5x+1)e−xdx
= −4
但我在想是否有任何 python 库可以生成我们想要的所有排列。
最佳答案
您尝试过 itertools.permutations 吗?
http://docs.python.org/library/itertools.html#itertools.permutations
import itertools
def my_combos(val):
results = []
l = itertools.permutations(val, len(val))
for c in l:
if all([x != y for (x,y) in zip(c,val)]):
results.append(c)
return list(set(results))
print my_combos([0,0,0,1,1,1])
print my_combos([1,1,2,2,14])
产量:
[(1, 1, 1, 0, 0, 0)]
[(2, 14, 1, 1, 2), (2, 2, 1, 14, 1), (14, 2, 1, 1, 2), (2, 2, 14, 1, 1)]
关于python - 找到可以重新排列序列的方式的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10683659/