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?
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
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" :)
Sans utiliser Zip
sum(e[0] for e in l), sum(e[1] for e in l)