In Python 3, dann würden Sie verwenden itertools.accumulate()
:
from itertools import accumulate
array = list(accumulate(rand(100)))
Accumulate das laufende Ergebnis der Addition die Werte des Eingangs ergibt iterable, mit dem ersten Startwert:
>>> from itertools import accumulate
>>> list(accumulate(range(10)))
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
Sie können eine andere Operation als zweites Argument übergeben; Dies sollte eine aufrufbare Funktion sein, die das akkumulierte Ergebnis und den nächsten Wert annimmt und das neue akkumulierte Ergebnis zurückgibt. Die operator
module ist sehr hilfreich bei der Bereitstellung von mathematischen Standardoperatoren für diese Art von Arbeit; Sie könnten es verwenden, um einen Lauf zu erzeugen, zum Beispiel zur Folge Multiplikation:
>>> import operator
>>> list(accumulate(range(1, 10), operator.mul))
[1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
Die Funktionalität leicht genug, um ältere Versionen zu zurückzuportieren ist (Python 2 oder Python 3.0 oder 3.1):
# Python 3.1 or before
import operator
def accumulate(iterable, func=operator.add):
'Return running totals'
# accumulate([1,2,3,4,5]) --> 1 3 6 10 15
# accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120
it = iter(iterable)
total = next(it)
yield total
for element in it:
total = func(total, element)
yield total
Sie zufällig numpy verwenden? Ich weiß, dass numpy eine nette Funktion für so etwas hat. – arshajii
Ich würde nicht ein Listenverständnis verwenden - Elemente werden erwartet, unabhängig voneinander zu sein, und in diesem Fall sind sie nicht. – Izkata
Warum möchten Sie dies in ein Listenverständnis umwandeln? Es ist viel besser lesbar, dies in einer separaten Schleife zu halten. Machen Sie stattdessen 'array = [0] ',' für i in rand (100): array.append (i + array [-1]) '. –