2017-03-27 4 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 

Was ich auskommentiert habe, ist mein Versuch, mit reduce, ist das nicht das richtige Format? reduzieren (Funktion, Reihenfolge). Nicht sicher, was ich hier falsch macheProbleme bei der Verwendung dieser Funktion

+1

reduzieren nimmt eine Funktion von * zwei Argumente *, keine Funktion, die bereits eine ganze Eingabeliste reduziert. Mit einer Funktion wie 'sum_of_squares', die eine ganze Eingabeliste nimmt und sie selbst reduziert, brauchen Sie nicht 'reduzieren'. – user2357112

+0

Beachten Sie, dass die Reducer-Funktion zwei Argumente haben sollte: das bisherige Ergebnis und den nächsten Wert. Es braucht nicht die ganze Liste. Um die Summe der Quadrate mit 'reduce' zu ​​berechnen, würden Sie' lambda x, y: x + y ** 2' wollen. – jonrsharpe

+0

@jonrsharpe: Nur dass das die erste Zahl nicht quadriert. Während Sie das Problem mit einem 'Start'-Argument patchen könnten, wäre es viel sauberer, 'map' für die Quadraturtransformation und' reduces' für die Summe zu verwenden. – user2357112

Antwort

1

Versuchen Sie sum_of_squares als reduce zu implementieren. Ich bin mir nicht sicher, was Sie mit reduce(sum_of_square, ...) zu tun versuchen:

Wenn den ehemaligen, dann können Sie sie implementieren:

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

Aber die sum(x**2 for x in L) tut genau das Gleiche.

0

reduce wird zwei Elemente nehmen, Funktion anwenden, das Ergebnis übernehmen und auf das nächste Element usw. bis zum Ende der Liste anwenden. Daher ist die Antwort in Ihrem Fall falsch.

Möglicherweise möchten Sie Platz Funktion auf die Liste zu erfassen und sie dann zusammenfassen wie folgt

l = [2,3,4] 

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

@AChampion, Ja das ist mir aufgefallen. aus der Antwort entfernt. Danke für das Aufzeigen. –

Verwandte Themen