Suma cada valor en una lista de tuplas

Tengo una lista de tuplas similar a esta:

l = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 0)] 

Quiero crear un sencillo de una sola línea que me dará el siguiente resultado:

 r = (25, 20) or r = [25, 20] # don't care if tuple or list. 

Lo que sería como hacer lo siguiente:

 r = [0, 0] for t in l: r[0]+=t[0] r[1]+=t[1] 

Estoy seguro de que es algo muy simple, pero no puedo pensar en ello.

Nota: ya he mirado preguntas similares:

¿Cómo sumo el primer valor en un conjunto de listas dentro de una tupla?

¿Cómo sumo el primer valor de cada tupla en una lista de tuplas en Python?

Utilice zip() y sum() :

 In [1]: l = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 0)] In [2]: [sum(x) for x in zip(*l)] Out[2]: [25, 20] 

o:

 In [4]: map(sum, zip(*l)) Out[4]: [25, 20] 

resultados de timeit :

 In [16]: l = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 0)]*1000 In [17]: %timeit [sum(x) for x in zip(*l)] 1000 loops, best of 3: 1.46 ms per loop In [18]: %timeit [sum(x) for x in izip(*l)] #prefer itertools.izip 1000 loops, best of 3: 1.28 ms per loop In [19]: %timeit map(sum, zip(*l)) 100 loops, best of 3: 1.48 ms per loop In [20]: %timeit map(sum, izip(*l)) #prefer itertools.izip 1000 loops, best of 3: 1.29 ms per loop 

Quiero añadir algo a la respuesta dada:

Si tengo una serie de dictado por ejemplo

 l = [{'quantity': 10, 'price': 5},{'quantity': 6, 'price': 15},{'quantity': 2, 'price': 3},{'quantity': 100, 'price': 2}] 

y quiero obtener dos (o más) sums de cantidad calculada sobre los valores, por ejemplo, sum de cantidades y de precio * cantidad

Puedo hacer:

 (total_quantity, total_price) = ( sum(x) for x in zip(*((item['quantity'], item['price'] * item['quantity']) for item in l))) 

En lugar de:

 total_quantity = 0 total_price = 0 for item in l: total_quantity += item['quantity'] total_price += item['price'] * item['quantity'] 

Tal vez la primera solución es menos legible, pero es más “pythonesque” 🙂

Sin usar zip

 sum(e[0] for e in l), sum(e[1] for e in l)