我正在嘗試編寫一個函數來計算字符串的唯一排列數。例如,aaa
將返回1
和abc
將返回6
。
我正在寫的方法是這樣的:在reduce函數中使用lambda函數中的math.factorial()
(僞代碼:)
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的列表中的階乘的lambda函數。但我不知道爲什麼。大多數其他lambda函數工程長度爲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
),但我正在尋找爲什麼這種方法不起作用。
@agf和鉑嗯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)'。 –