gpt4 book ai didi

python - 在带有 reduce() 的 lambda 函数中使用 math.factorial

转载 作者:太空宇宙 更新时间:2023-11-04 10:58:45 24 4
gpt4 key购买 nike

我正在尝试编写一个函数来计算字符串的唯一排列数。例如 aaa 将返回 1abc 将返回 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 的列表上运行带有阶乘的 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),但我正在寻找为什么这特别不起作用。

最佳答案

请参阅 reduce() 的文档,有一个可选的“初始化程序”参数,它被放置在列表中所有其他元素之前,以便一个元素列表的行为是一致的,例如,对于您的 ord() lambda,您可以设置 initializerord() 为 0 的字符:

>>> reduce(lambda x, y: ord(x) + ord(y), ['a'], chr(0))
97

关于python - 在带有 reduce() 的 lambda 函数中使用 math.factorial,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7560284/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com