Я пытаюсь написать функцию, которая вычисляет количество уникальных перестановок строки. Например, aaa
вернет 1
, а abc
вернет 6
.
Я пишу метод следующим образом:
(Псевдокод :)
len(string)! / (A!*B!*C!*...)
где A,B,C — количество вхождений каждого уникального символа. Например, строка 'aaa'
будет 3! / 3! = 1
, а 'abc'
будет 3! / (1! * 1! * 1!) = 6
.
Мой код пока такой:
def permutations(n):
'''
returns the number of UNIQUE permutations of n
'''
from math import factorial
lst = []
n = str(n)
for l in set(n):
lst.append(n.count(l))
return factorial(len(n)) / reduce(lambda x,y: factorial(x) * factorial(y), lst)
Все работает нормально, за исключением случаев, когда я пытаюсь передать строку, содержащую только один уникальный символ, т.е. aaa
- я получаю неправильный ответ:
>>> perm('abc')
6
>>> perm('aaa')
2
>>> perm('aaaa')
6
Теперь я могу сказать, что проблема заключается в запуске лямбда-функции с факториалами в списке длины 1. Однако я не знаю, почему. Большинство других лямбда-функций работают со списком длиной 1, даже если он ожидает два элемента:
>>> reduce(lambda x,y: x * y, [3])
3
>>> reduce(lambda x,y: x + y, [3])
3
Этот не:
>>> reduce(lambda x,y: ord(x) + ord(y), ['a'])
'a'
>>> reduce(lambda x,y: ord(x) + ord(y), ['a','b'])
195
Есть ли что-то, что я должен делать по-другому? Я знаю, что могу переписать функцию разными способами, чтобы обойти это (например, не используя lambda
), но я ищу, почему это конкретно не работает.