我在python中有以下reduce函数,它应该返回字符串中所有字符的ASCII值之和。例如,对于字符串“BOY”,reduce函数应返回234。
reduce(lambda x,y:ord(x)+ord(y),list("BOY"))
但我得到以下错误:
TypeError: ord() expected string of length 1, but int found
我的代码有什么问题?
答案 0 :(得分:3)
reduce(lambda x,y:ord(x)+ord(y),list("BOY"))
想想这会如何减少:
'B' 'O' 'Y'
145 'Y'
什么是ord(145) + ord('Y')
?这是一个错误。
其他人建议:
reduce(lambda x, y: x + ord(y), "BOY", 0)
减少如下:
0 'B' 'O' 'Y'
66 'O' 'Y'
145 'Y'
234
我建议
sum(map(ord, "BOY"))
答案 1 :(得分:2)
这应该是
>>> reduce(lambda x, y: x + ord(y), "BOY", 0)
234
lambda函数的左操作数x
将始终是前一次调用函数的结果,因此它是一个整数。我们需要提供一个起始值0
,但没有必要将字符串转换为列表 - 字符串本身是可迭代的。
如果您遵循Guido's recommendation to write the accumulation loop explicitly:
,则可以避免此问题result = 0:
for x in "BOY":
result += ord(x)
答案 2 :(得分:2)
为什么不sum(map(ord, "BOY"))
?