web-dev-qa-db-fra.com

additionner chaque valeur dans une liste de tuples

J'ai une liste de tuples similaires à ceci:

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

Je veux créer une simple doublure qui me donnera le résultat suivant:

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

Ce serait comme faire ce qui suit:

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

Je suis sûr que c'est quelque chose de très simple, mais je n'y pense pas.

Remarque: j'ai déjà examiné des questions similaires:

Comment additionner la première valeur d'un ensemble de listes dans un tuple?

Comment additionner la première valeur de chaque Tuple dans une liste de tuples en Python?

27
Inbar Rose

Utilisez Zip() et 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]

ou:

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

timeit résultats:

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
54
Ashwini Chaudhary

Je veux ajouter quelque chose à la réponse donnée:

Si j'ai un tableau de dict par exemple.

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

et je veux obtenir deux (ou plus) sommes de quantité calculée sur les valeurs par ex. somme des quantités et du prix * quantité

Je peux faire:

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

Au lieu de:

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

Peut-être que la première solution est moins lisible, mais est plus "pythonesque" :)

2
Alessandro Ruffolo

Sans utiliser Zip

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