Como posso resumir o primeiro valor em cada tupla em uma lista de tuplas em Python?

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

  •  10-07-2019
  •  | 
  •  

Pergunta

Eu tenho uma lista de tuplas (sempre pares) como este:

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

Eu gostaria de encontrar a soma dos primeiros itens em cada par, i:.

0 + 2 + 5 + 2

Como posso fazer isso em Python? No momento eu estou iteração através da lista:

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

Eu tenho um sentimento que deve haver uma maneira mais Pythonic.

Foi útil?

Solução

Uma versão compatível com Python 2.3 é

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

ou em versões recentes do Python, consulte este resposta ou esta .

Outras dicas

sum(i for i, j in list_of_pairs)

irá fazer também.

Eu recomendo:

sum(i for i, _ in list_of_pairs)

Nota :

Usando o _ variável (ou __ para evitar incompatibilidade com o nome alternativo de gettext) em vez de j tem pelo menos duas vantagens:

  1. _ (que significa espaço reservado) tem melhor legibilidade
  2. pylint não vai reclamar: "variável não utilizada 'j'"

Se você tem uma lista muito grande ou um gerador que produz um grande número de pares que você pode querer usar uma abordagem baseada gerador. Para se divertir itemgetter() eu uso e imap() também. A abordagem baseada simples gerador pode ser suficiente, no entanto.

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

Note que itertools.imap() está disponível em Python> = 2,3. Assim você pode usar uma abordagem baseada gerador de lá, também.

resposta Obscure (mas divertido):

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

Ou quando zip de são iterables só isso deve funcionar:

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

Segue-se código de exemplo, você também pode especificar o intervalo de 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

Se você não se importa convertê-lo para uma matriz numpy, você pode usar np.sum sobre axis=0 como dado aqui

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top