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

标签 python permutation combinatorics

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

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

相关文章:

Python 辅音/元音排列

combinatorics - 查找彩票组合的排名

r - 遍历数据框中所有可能的列和行组合

python - 在 Beam 管道中以编程方式生成 BigQuery 架构

python - 使用phonenumbers包解析后如何获取国家代码和国家电话号码?

python - 仅在一台机器上工作的无方案数据库解决方案?

algorithm - 为密码破解者提取列表子集的组合算法

python - 在 Python 正则表达式 split() 中访问定界符

c++ - 确定两个字符串是否互为排列的程序的时间复杂度

java - java中的高效排列算法