Как мне суммировать первое значение в каждом кортеже в списке кортежей в Python?

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

  •  10-07-2019
  •  | 
  •  

Вопрос

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

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

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

0 + 2 + 5 + 2

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

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

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

Это было полезно?

Решение

Версия, совместимая с 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
    

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top