计算Python中的排列

时间:2013-05-09 02:02:28

标签: python

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

首先我有这个:

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'],这是排列()工作所需要的。集擦除了相同的排列。列表列出了这个。 len计算我可以使用a1,a1,a1进行多少排列。

所以基本上我想要的只是计算排列的数量......但是我的代码是非常的!!!慢 !谢谢!

2 个答案:

答案 0 :(得分:12)

使用数学。列表的排列数是列表长度的阶乘,除以每个元素的多重性的阶乘的乘积(因为重复元素的集合被置换而没有影响)。

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

答案 1 :(得分:0)

如果你想要替换排列,这就存在并被称为笛卡尔积。 Itertools具有此功能,product()

>>> for i in itertools.product('ABC', repeat=3):
...     print i
...
('A', 'A', 'A')
('A', 'A', 'B')
('A', 'A', 'C')
('A', 'B', 'A')
('A', 'B', 'B')
('A', 'B', 'C')
('A', 'C', 'A')
('A', 'C', 'B')
('A', 'C', 'C')
('B', 'A', 'A')
('B', 'A', 'B')
('B', 'A', 'C')
('B', 'B', 'A')
('B', 'B', 'B')
('B', 'B', 'C')
('B', 'C', 'A')
('B', 'C', 'B')
('B', 'C', 'C')
('C', 'A', 'A')
('C', 'A', 'B')
('C', 'A', 'C')
('C', 'B', 'A')
('C', 'B', 'B')
('C', 'B', 'C')
('C', 'C', 'A')
('C', 'C', 'B')
('C', 'C', 'C')