Pregunta

Tengo una lista de tuplas (siempre pares) como esta:

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

Me gustaría encontrar la suma de los primeros elementos en cada par, es decir:

0 + 2 + 5 + 2

¿Cómo puedo hacer esto en Python? En este momento estoy iterando por la lista:

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

Tengo la sensación de que debe haber una manera más pitónica.

¿Fue útil?

Solución

Una versión compatible con Python 2.3 es

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

o en versiones recientes de Python, consulte esta respuesta o este .

Otros consejos

sum(i for i, j in list_of_pairs)

también lo hará.

Recomiendo:

sum(i for i, _ in list_of_pairs)

Nota :

Uso de la variable _ (o __ para evitar conflictos con el alias de gettext ) en lugar de j tiene al menos dos beneficios:

  1. _ (que significa marcador de posición) tiene una mejor legibilidad
  2. pylint no se quejará: " variable no utilizada 'j' "

Si tiene una lista muy grande o un generador que produce una gran cantidad de pares, es posible que desee utilizar un enfoque basado en un generador. Por diversión también uso itemgetter () y imap () . Sin embargo, un enfoque basado en un generador simple podría ser suficiente.

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))

Tenga en cuenta que itertools.imap () está disponible en Python > = 2.3. Así que también puedes usar un enfoque basado en generador allí.

Respuesta oscura (pero divertida):

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

O cuando los archivos zip son iterables solo esto debería funcionar:

>>> sum(zip(*list_of_pairs).__next__())
9

A continuación se muestra el código de muestra, también puede especificar el rango de la lista.

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

Si no le importa convertirlo en una matriz numpy, puede usar np.sum sobre axis = 0 como se da aquí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top