Я пытаюсь написать функцию, которая вычисляет количество уникальных перестановок строки.Например, 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
), но я ищу, почему это конкретно не работает.