Come posso sommare il primo valore in ciascuna tupla in un elenco di tuple in Python?
Domanda
Ho un elenco di tuple (sempre coppie) in questo modo:
[(0, 1), (2, 3), (5, 7), (2, 1)]
Vorrei trovare la somma dei primi elementi in ciascuna coppia, ovvero:
0 + 2 + 5 + 2
Come posso farlo in Python? Al momento sto scorrendo l'elenco:
sum = 0
for pair in list_of_pairs:
sum += pair[0]
Ho la sensazione che ci debba essere un modo più pitonico.
Soluzione
Una versione compatibile con Python 2.3 è
sum([pair[0] for pair in list_of_pairs])
o nelle versioni recenti di Python, vedi questa risposta o questo .
Altri suggerimenti
sum(i for i, j in list_of_pairs)
lo farà anche.
Raccomando:
sum(i for i, _ in list_of_pairs)
Nota :
Utilizzo della variabile _
(o __
per evitare conflitti con l'alias di gettext
) anziché j
ha almeno due vantaggi:
-
_
(che sta per segnaposto) ha una migliore leggibilità -
pylint
non si lamenterà: " Variabile inutilizzata 'j' "
Se si dispone di un elenco molto ampio o di un generatore che produce un numero elevato di coppie, è possibile utilizzare un approccio basato sul generatore. Per divertimento uso anche itemgetter ()
e imap ()
. Tuttavia, potrebbe essere sufficiente un semplice approccio basato su un generatore.
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))
Nota che itertools.imap ()
è disponibile in Python > = 2.3. Quindi puoi anche usare un approccio basato sul generatore.
Risposta oscura (ma divertente):
>>> sum(zip(*list_of_pairs)[0])
9
O quando gli zip sono iterabili solo questo dovrebbe funzionare:
>>> sum(zip(*list_of_pairs).__next__())
9
Di seguito è riportato un codice di esempio, è inoltre possibile specificare l'intervallo di elenchi.
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
Se non ti dispiace convertirlo in un array numpy, puoi usare np.sum
su axis = 0
come indicato qui