计数排列数最快的方法是什么?我有以下问题:

首先我有这个:

ncombos = itertools.combinations_with_replacement(['a1', 'a2', 'a3'], years*n)
('a1', 'a1', 'a1')
('a1', 'a1', 'a2')
('a1', 'a1', 'a3')
('a1', 'a2', 'a2')
.... etc.....
('a3', 'a3', 'a3')

目的是要遍历每个变量,并计算每个变量具有的排列数,并使用这些值构造一个数组。我使用以下方法实现了此目的:
nodes = np.ones(len(leafs)); i=0  #This will store the number of permutations

for j in ncombos:
    nodes[i] =len(list(set(itertools.permutations(np.asanyarray(j), n))))
    i = i+1

np.asanyarray(j)将('a1','a1','a1')转换为形式化的['a1','a1','a1'],这需要permutations()起作用。 set删除相同的排列。 list列出了这个列表。 len计算我可以用a1,a1,a1进行多少排列。

因此,基本上我只想计算排列的数量...但是我的代码非常棒!!!慢的 !谢谢!

最佳答案

使用数学。列表的排列数量是列表长度的阶乘除以每个元素的多重性的阶乘乘积的乘积(因为重复的元素集被排列而没有任何效果)。

import operator
from collections import Counter
from math import factorial
def npermutations(l):
    num = factorial(len(l))
    mults = Counter(l).values()
    den = reduce(operator.mul, (factorial(v) for v in mults), 1)
    return num / den

例子:
>>> npermutations([1,1,1])
1
>>> npermutations([1,2,3])
6
>>> npermutations([1,3,1,2,1,3,1,2])
420

关于python - 在 Python 中计算排列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16453188/

10-13 07:22
查看更多