Come posso sommare il primo valore in ciascuna tupla in un elenco di tuple in Python?

StackOverflow https://stackoverflow.com/questions/638048

  •  10-07-2019
  •  | 
  •  

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.

È stato utile?

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:

  1. _ (che sta per segnaposto) ha una migliore leggibilità
  2. 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top