Ответ 1
Версия, совместимая с Python 2.3,
sum([pair[0] for pair in list_of_pairs])
или в последних версиях Python, см. этот ответ или этот.
У меня есть список кортежей (всегда пары), например:
[(0, 1), (2, 3), (5, 7), (2, 1)]
Я хотел бы найти сумму первых элементов в каждой паре, то есть:
0 + 2 + 5 + 2
Как я могу сделать это в Python? На данный момент я повторяю список:
sum = 0
for pair in list_of_pairs:
sum += pair[0]
У меня есть ощущение, что должен быть более питонический путь.
Версия, совместимая с Python 2.3,
sum([pair[0] for pair in list_of_pairs])
или в последних версиях Python, см. этот ответ или этот.
sum(i for i, j in list_of_pairs)
тоже сделает.
Я рекомендую:
sum(i for i, _ in list_of_pairs)
Примечание:
Использование переменной _
(или __
во избежание конфликтов с псевдонимом gettext
) вместо j
имеет как минимум два преимущества:
_
(который обозначает местозаполнитель) имеет лучшую читаемость.pylint
не будет жаловаться: "Неиспользуемая переменная" j "" Если у вас очень большой список или генератор, который создает большое количество пар, вы можете использовать генераторный подход. Для развлечения я также использую 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. Таким образом, вы также можете использовать генераторный подход.
Неясный (но забавный) ответ:
>>> sum(zip(*list_of_pairs)[0])
9
Или, когда zip являются итерами, только это должно работать:
>>> sum(zip(*list_of_pairs).__next__())
9
Ниже приведен пример кода, вы также можете указать диапазон списка.
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
Если вы не против преобразовать его в массив numpy, вы можете использовать np.sum
по axis=0
как здесь