在Python中使用reduce函数时使用ord()时出错

时间:2012-03-17 20:10:50

标签: python functional-programming

我在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

我的代码有什么问题?

3 个答案:

答案 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"))