2012-03-17 93 views
0

我在python中有以下reduce函數,它應該返回字符串中所有字符的ASCII值的總和。例如,對於字符串「BOY」精簡函數應該返回234Python中的reduce函數中使用ord()時出錯

reduce(lambda x,y:ord(x)+ord(y),list("BOY")) 

但即時得到以下錯誤:

TypeError: ord() expected string of length 1, but int found 

什麼是我的代碼的問題?

回答

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")) 
+0

謝謝。它對我來說很清楚:) – user1276174 2012-03-17 20:28:23

+0

@ user1276174作爲使用reduce的一般注意事項,請注意當函數產生的結果與存儲在集合中的結果不同時的結果。在這種情況下,您必須提供一個初始值,並且函數需要接受一個與它生成的結果類型相同的參數和一個來自該集合的參數。 – Ben 2012-03-20 01:36:19

2

這應該是

>>> reduce(lambda x, y: x + ord(y), "BOY", 0) 
234 

lambda函數的左操作數x永遠是函數的前一個調用的結果,所以這是一個整數。 Wee需要提供一個起始值0,但不需要將字符串轉換爲列表 - 該字符串本身是可迭代的。

你本來可以避免這個問題,如果你將跟隨Guido's recommendation to write the accumulation loop explicitly

result = 0: 
for x in "BOY": 
    result += ord(x) 
+1

感謝您的答覆。這有效,但你能解釋爲什麼這個工程和我的代碼錯誤?。謝謝 – user1276174 2012-03-17 20:13:30

+0

@ user1276174:我添加了一些解釋。 – 2012-03-17 20:15:36

+1

+1對於一個很好的解釋和指示Guido的偏好,但我認爲羅馬的方法在這個特定情況下更好。 – 2012-03-17 20:26:09

2

爲什麼不sum(map(ord, "BOY"))

相關問題