In Python 3, utilizza itertools.accumulate()
:
from itertools import accumulate
array = list(accumulate(rand(100)))
Accumulate produce il risultato di esecuzione di sommando i valori dell'ingresso iterabile, a partire dal primo valore:
>>> from itertools import accumulate
>>> list(accumulate(range(10)))
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
È possibile passare a un'altra operazione come secondo argomento; questo dovrebbe essere un callable che prende il risultato accumulato e il valore successivo, restituendo il nuovo risultato accumulato. Il operator
module è molto utile per fornire operatori matematici standard per questo tipo di lavoro; si potrebbe usare per produrre una corsa moltiplicazione provocare ad esempio:
>>> import operator
>>> list(accumulate(range(1, 10), operator.mul))
[1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
La funzionalità è abbastanza facile da backport di versioni più vecchie (Python 2, o Python 3.0 o 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
Stai usando NumPy per caso? So che Numpy ha una buona funzione per qualcosa di simile. – arshajii
Non userei la comprensione di una lista - ci si aspetta che gli elementi siano indipendenti l'uno dall'altro, e in questo caso non lo sono. – Izkata
Perché vorresti trasformare questo in una comprensione di lista? È molto più leggibile tenere questo in un ciclo separato. Rendilo 'array = [0]', 'for i in rand (100): array.append (i + array [-1])' invece, forse. –