web-dev-qa-db-fra.com

Comment additionner la première valeur de chaque tuple dans une liste de n-uplets en Python?

J'ai une liste de tuples (toujours des paires) comme ceci:

[(0, 1), (2, 3), (5, 7), (2, 1)]

J'aimerais trouver la somme des premiers articles de chaque paire, c'est-à-dire:

0 + 2 + 5 + 2

Comment puis-je faire cela en Python? En ce moment, je parcours la liste:

sum = 0
for pair in list_of_pairs:
   sum += pair[0]

J'ai le sentiment qu'il doit y avoir une manière plus pythonique.

25
Ben

Une version compatible avec Python 2.3 est

sum([pair[0] for pair in list_of_pairs])

ou dans les versions récentes de Python, voir cette réponse ou celle-ci .

57
David Z
sum(i for i, j in list_of_pairs)

va faire aussi.

36
SilentGhost

Je recommande:

sum(i for i, _ in list_of_pairs)

Remarque

L'utilisation de la variable _ (ou __ pour éviter les conflits avec l'alias gettext) au lieu de j présente au moins deux avantages:

  1. _ (qui signifie espace réservé) a une meilleure lisibilité
  2. pylint ne se plaindra pas: "Variable non utilisée 'j'"
15
Hui Zheng

Si vous avez une très grande liste ou un générateur qui produit un grand nombre de paires, vous pouvez utiliser une approche basée sur un générateur. Pour le plaisir, j'utilise aussi itemgetter() et imap(). Une simple approche basée sur un générateur pourrait toutefois suffire.

import operator
import itertools

idx0 = operator.itemgetter(0)
list_of_pairs = [(0, 1), (2, 3), (5, 7), (2, 1)]
sum(itertools.imap(idx0, list_of_pairs))

Notez que itertools.imap() est disponible en Python> = 2.3. Ainsi, vous pouvez également utiliser une approche basée sur un générateur.

5
unbeknown

Obscur (mais amusant) réponse:

>>> sum(Zip(*list_of_pairs)[0])
9

Ou, lorsque les Zip sont des itérables, seul cela devrait fonctionner:

>>> sum(Zip(*list_of_pairs).__next__())
9
3
Ali Afshar

Si cela ne vous dérange pas de le convertir en tableau numpy, vous pouvez utiliser np.sum sur axis=0 tel que donné ici

0
mithunpaul

Vous trouverez ci-dessous un exemple de code, vous pouvez également spécifier la plage de liste.

def test_lst_sum():
    lst = [1, 3, 5]
    print sum(lst)  # 9
    print sum(lst[1:])  # 8

    print sum(lst[5:])  # 0  out of range so return 0
    print sum(lst[5:-1])  # 0

    print sum(lst[1: -1])  # 3

    lst_tp = [('33', 1), ('88', 2), ('22', 3), ('44', 4)]
    print sum(x[1] for x in lst_tp[1:])  # 9
0
Jayhello