文字列の一意の順列の数を計算する関数を作成しようとしています。たとえば、aaa
return1
とabc
return を返し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)
一意の文字が 1 つしかない文字列を渡そうとした場合を除いて、すべて正常に動作します。つまりaaa
、間違った答えが得られます。
>>> perm('abc')
6
>>> perm('aaa')
2
>>> perm('aaaa')
6
ここで、長さ 1 のリストに対して階乗を使用してラムダ関数を実行することに問題があることがわかります。ただし、その理由はわかりません。他のほとんどのラムダ関数は、2 つの要素が必要な場合でも、長さ 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
)、これが具体的に機能しない理由を探しています。