List comprehension with an accumulator
list-comprehension, python
Solution
In Python 3, you'd use `itertools.accumulate()`:
from itertools import accumulate
array = list(accumulate(rand(100)))
Accumulate yields the running result of adding up the values of the input iterable, starting with the first value:
>>> from itertools import accumulate
>>> list(accumulate(range(10)))
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
You can pass in a different operation as a second argument; this should be a callable that takes the accumulated result and the next value, returning the new accumulated result. The `operator` module is very helpful in providing standard mathematical operators for this kind of work; you could use it to produce a running multiplication result for example:
>>> import operator
>>> list(accumulate(range(1, 10), operator.mul))
[1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
The functionality is easy enough to backport to older versions (Python 2, or Python 3.0 or 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
Problem
What is the best way to replicate this simple function using a list comprehension (or another compact approach)? ``` import numpy as np sum=0 array=[] for i in np.random.rand(100): sum+=i array.append(sum) ```