문자열의 고유 순열 수를 계산하는 함수를 작성하려고합니다. 예를 들어 aaa
은 1
이고 abc
은 6
을 반환합니다.
이 같은 방법을 쓰고 있어요 :lambda 함수에서 reduce()를 사용하여 math.factorial 사용
(의사 코드 : A, B, C는 각각의 고유 한 문자의 발생 횟수가
len(string)!/(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의 목록에서 계승으로 람다 함수를 실행하는 것입니다. 이유는 모르겠지만.
>>> 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
거기에 그 두 가지 요소를 기대하는 경우에도 대부분의 다른 람다 함수는 길이 1의 목록에서 작동? 나는 이것을 피할 수있는 다양한 방법으로 함수를 다시 작성할 수 있다는 것을 알고있다. (예를 들어, lambda
을 사용하지 않는다.) 그러나 이것이 특별히 작동하지 않는 이유를 찾고있다.
@agf 및 플래티넘 : 목록에 하나의 요소 목록의 동작은 당신이
ord()
0으로 문자로initializer
를 설정할 수 있습니다 당신의ord()
람다, 예를 들어, 일치되도록 음 Azure - 고마워,이 크기가 1 목록에 대해 작동하지만 큰 아무것도 실패합니다. 왜? 문서는 초기 값이리스트가 단순히 하나의 요소 일 때처럼 처리되어야한다고 말한다. – HodofHod'reduce (lambda x, y : x * factorial (y), lst, 1)'을 시도해 볼 수도 있습니다. 당신이 계산 한 람다는'((1! * 2!)! * 3!)! ... '. – cHao
첫 번째 인수에'factorial (x)'를 사용해야합니까? 모든 팩토리얼의 제품을 원한다면'reduce (lambda x, y : x * factorial (y), lst, 1)'을 사용해야합니다. –