¿Cómo sumo el primer valor de cada tupla en una lista de tuplas en Python?
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.
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:
-
_
(que significa marcador de posición) tiene una mejor legibilidad -
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í