¿Cómo puedo hacer la operación matemática en los elementos de la lista en python?

Supongamos que tengo una lista de números [3, 51, 34] . Quiero agregar a cada elemento la sum de los elementos anteriores y devolver una nueva lista con estos nuevos valores. Así que aquí el resultado sería [3, 54, 88] . ¿Cómo hacerlo en general en una lista de entrada de tamaño arbitrario? La última línea de este código debería funcionar en las listas de tamaño conocido.

 indices1 = range(len(list1)) indices1.sort(key=lambda x: list2[x]) list1 = map(lambda i: list1[i], indices1) labelled = zip(list1, ascii_uppercase) sorted_data = sorted(labelled, key=itemgetter(0)) labels = [pair[1] for pair in sorted_data] newlist, = [ 0, list1[0], list1[1] + list1[2], list1[0] + list[1] + list[2]] 

un simple reducir:

 nums = [3,51,34] reduce(lambda x, y: [y] if not x else x + [y + x[-1]], nums, None) # [3, 54, 88] 

numpy.cumsum puede ser una buena opción para algo como esto.

 In [1]: import numpy as np In [2]: a = [3,51,34] In [3]: np.cumsum(a) Out[3]: array([ 3, 54, 88]) 

Y una solución trivial, procesal, para completar:

 a = [3,51,34] def cumsum(numbers): accum = 0 result = [] for n in numbers: accum += n result.append(accum) return result print cumsum(a) 

Imprime [3, 54, 88]

Un enfoque de comprensión de lista, porque eso siempre es divertido:

 >>> data = [3, 51, 34] >>> result = [n + sum(data[:i]) for i, n in enumerate(data)] >>> result [3, 54, 88] 

solución basada en generador

 In [25]: ll = [3,51,34] In [26]: def acc(myiter): ....: it = iter(myiter) ....: total = it.next() ....: yield total ....: for element in it: ....: total = total + element ....: yield total ....: In [27]: acc(ll) Out[27]:  In [28]: [x for x in acc(ll)] Out[28]: [3, 54, 88] 

Como será el más rápido:

 In [29]: %timeit [x for x in acc(ll)] 1000000 loops, best of 3: 1.26 µs per loop In [30]: import numpy as np In [31]: np.cumsum(ll) Out[31]: array([ 3, 54, 88]) In [32]: %timeit np.cumsum(ll) 100000 loops, best of 3: 15.8 µs per loop In [33]: %timeit reduce(lambda x, y: [y] if not x else x + [y + x[-1]], ll, None) 1000000 loops, best of 3: 1.87 µs per loop In [34]: %timeit [n + sum(ll[:i]) for i, n in enumerate(ll)] 100000 loops, best of 3: 1.99 µs per loop