Skip to main content
 首页 » 编程设计

python之找到可以重新排列序列的方式的数量

2025年05月04日16zdz8207

我如何找到可以重新排列数字序列(可能包含相似项目)的方式的数量,以便数字不会与它或相似数字放在同一位置。

例如,[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)]