2017-03-27 18 views
-2
sum_of_squares = lambda L: sum([x**2 for x in L]) 
#reduce(sum_of_squares,[1]) 

assert sum_of_squares([2,3,4]) == 29 
assert sum_of_squares([]) == 0 
assert sum_of_squares([1]) == 1 

我已經評論過的是我嘗試使用reduce,是不是正確的格式?減少(函數,序列)。不知道我在這裏做錯了什麼麻煩使用減少到這個功能

+1

減少花費的*兩個參數*,而不是已經降低了整個輸入列表功能的功能。使用像'sum_of_squares'這樣的函數,它接收整個輸入列表並自行減少它,您不需要'reduce'。 – user2357112

+0

請注意,reducer函數應該有兩個參數:到目前爲止的結果和下一個值。它不包括整個列表。要用'reduce'做正方形的總和,你需要'lambda x,y:x + y ** 2'。 – jonrsharpe

+0

@jonrsharpe:除了那不是第一個數字。雖然你可以用「開始」參數來修補問題,但使用「map」進行平方轉換和「減少」總和會更清晰。 – user2357112

回答

1

您是否試圖執行sum_of_squares作爲reduce。我不知道你正試圖與reduce(sum_of_square, ...)做什麼:

如果是前者,那麼你可以實現它:

>>> import functools as ft 
>>> import operator as op 
>>> sum_of_squares = lambda L: ft.reduce(op.add, map(lambda x: x**2, L), 0) 
>>> assert sum_of_squares([2,3,4]) == 29 
>>> assert sum_of_squares([]) == 0 
>>> assert sum_of_squares([1]) == 1 

sum(x**2 for x in L)不完全一樣的東西。

0

reduce將採用兩個元素,應用函數,將結果應用到下一個元素,直到列表結束。因此,在你的情況下,答案是不正確的。

您可能需要二次函數映射到列表中,然後概括起來如下,

l = [2,3,4] 

print sum((map(lambda x : x**2 ,l))) 
>>> 
29 
>>> 
+0

@AChampion,是的,我注意到了。從答案中刪除。感謝您指出。 –