2017-12-18 1 views
1

Ich versuche eine Version der kumulativen Summe in Python mit der Reduce-Funktion zu schreiben. Hier ist mein Code so weit:Python Cumsum mit Reduce-Funktion

from functools import reduce 

def my_cum_sum(arg): 
    return reduce(lambda a, x: (a.append(a[-1] + x)) if len(a) > 0 else a.append(x), arg, []) 

assert(my_cum_sum([1, 1, 1, 1]) == [1, 2, 3, 4])) 

Aber das Problem ist, dass in meiner Lambda-Funktion, Python weiß nicht, dass ein (mein Akku-Parameter) ist eine Liste Objekt, und ich möchte, dass meine Funktion reduzieren zurückzukehren eine Liste. In anderen funktionalen Programmiersprachen könnte ich den Typ a und x angeben. Aber ich bin neu bei Python und habe noch nicht ganz herausgefunden, wie es mit Typen und Dingen umgeht. Was ist der pythonische Weg, dieses Problem zu lösen?

Antwort

1

append gibt None zurück, so dass Sie die Liste nicht zurück in reduce wie folgt erhalten können. einfach die Addition zwischen der Liste und einer Liste eines einzelnen Elements gemacht, oder einfach nur eine anfänglichen Elements aus Liste, wenn die Liste leer ist:

from functools import reduce 

def my_cum_sum(arg): 
    return reduce(lambda a, x: a + [a[-1]+x] if a else [x], arg, []) 

print (my_cum_sum([1, 1, 1, 1])) 

Ergebnis:

[1, 2, 3, 4] 

(beachten Sie, dass if len(a)>0 ist besser geschrieben if a als auch)