Python 如何在不建立临时列表的情况下计算唯一排列的数量?

Python 如何在不建立临时列表的情况下计算唯一排列的数量?,python,math,combinatorics,Python,Math,Combinatorics,如何计算这个数字,而不是枚举所有排列,然后创建一个集合来切断所有重复 len(set(itertools.permutations('aaabbb'))) 20 len(set(itertools.permutations('aabb'))) 6 设counts是一个数组,其counts[k]=第k个符号的计数 我们需要一种让python轻松计算一系列乘法的方法,一个product()函数 发件人: 现在我们可以将排列的数量定义为: def unique_permutations(count

如何计算这个数字,而不是枚举所有排列,然后创建一个集合来切断所有重复

len(set(itertools.permutations('aaabbb')))
20

len(set(itertools.permutations('aabb')))
6

设counts是一个数组,其counts[k]=第k个符号的计数

我们需要一种让python轻松计算一系列乘法的方法,一个product()函数

发件人:

现在我们可以将排列的数量定义为:

def unique_permutations(counts):
    return math.factorial(sum(counts))/product(map(math.factorial, counts))
在另一种语言中,我们不得不担心,由于采用大阶乘或乘以许多小阶乘,在这个除法中会出现大量的数字。通常,在某一点上,计算将溢出MAXINT或MAXFLOAT规范。但在python中,所有整数操作都是精确的,需要取尽可能多的数字,并且整数溢出在设计中不会发生。速度可能成为一个问题,但那是另一回事

如何使用它:

>>> unique_permutations([3,3])
20

>>> unique_permutations([2,2])
6

有关如何执行此操作的数学信息,请参见如果您有每个字母的
N_i
副本,则您需要的数字就是

(N_1+N_2+…+N_k)/(N_1!N_2!…N_k!)


有关在没有溢出的情况下计算此值的方法,请参阅。

这确实属于math.stackexchange.com。我不同意@Karl Knechtel。数学是编程和计算机科学不可或缺的组成部分。
>>> unique_permutations([3,3])
20

>>> unique_permutations([2,2])
6