Как мне суммировать первое значение в каждом кортеже в списке кортежей в Python? - PullRequest
27 голосов
/ 12 марта 2009

У меня есть список кортежей (всегда пар), как это:

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

Я бы хотел найти сумму первых предметов в каждой паре, т.е.

0 + 2 + 5 + 2

Как я могу сделать это в Python? На данный момент я перебираю список:

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

У меня такое ощущение, что должен быть более питонский путь.

Ответы [ 7 ]

60 голосов
/ 12 марта 2009

Версия, совместимая с Python 2.3:

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

или в последних версиях Python см. этот ответ или этот .

36 голосов
/ 12 марта 2009
sum(i for i, j in list_of_pairs)

тоже подойдет.

15 голосов
/ 21 апреля 2012

Рекомендую:

sum(i for i, _ in list_of_pairs)

Примечание :

Использование переменной _ (или __ во избежание конфликта с псевдонимом gettext) вместо j имеет как минимум два преимущества:

  1. _ (что означает заполнитель) имеет лучшую читаемость
  2. pylint не будет жаловаться: «Неиспользуемая переменная« j »»
5 голосов
/ 12 марта 2009

Если у вас очень большой список или генератор, который создает большое количество пар, вы можете использовать подход на основе генератора. Для развлечения я использую itemgetter() и imap() тоже. Однако может быть достаточно простого подхода на основе генератора.

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

Обратите внимание, что itertools.imap() доступно в Python> = 2.3. Таким образом, вы также можете использовать подход, основанный на генераторе.

3 голосов
/ 12 марта 2009

Неясный (но веселый) ответ:

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

Или, если почтовые индексы являются итерируемыми, только это должно работать:

>>> sum(zip(*list_of_pairs).__next__())
9
0 голосов
/ 05 августа 2018

Если вы не возражаете преобразовать его в пустой массив, вы можете использовать np.sum над axis=0, как указано здесь

0 голосов
/ 27 декабря 2017

Ниже приведен пример кода, вы также можете указать диапазон списка.

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