Como somar todos os valores em um dicionário?


239

Digamos que eu tenho um dicionário no qual as chaves são mapeadas para números inteiros como:

d = {'key1': 1,'key2': 14,'key3': 47}

Existe uma maneira sintaticamente minimalista de retornar a soma dos valores em d-ie 62, neste caso?


2
Apenas por diversão: implemente- sumse em termos de reduce- reduceé uma forma mais geral (por exemplo sum, mine maxpode ser escrita em termos de reduce) e pode resolver outros problemas (por exemplo product) facilmente.

1
E o que diz o Guido - acho que me lembro disso corretamente - que a redução está diminuindo? Estou contigo. Por que removê-lo do idioma?
— Octopusgrabbus

Respostas:


471

Como seria de esperar:

sum(d.values())

1
Bem, Python 2.7.12também funciona bem comsum(d.values())
— LancelotHolmes

7
@LancelotHolmes Sim, mas isso cria uma lista na memória e, portanto, pode ser mais lento / mais próximo dos limites de recursos para dicionários grandes. Assim, esta resposta diz "você pode querer usar" em vez de "você deve usar" quando se discute Python 2.
— phihag

Agradável! Eu procurei apenas porque sabia que haveria algo assim. Não que é preciso muito trabalho para escrever um tolo morto loop for embora;)
— runlevel0

Eu não sei se você ama python, se você ama python 3, ou se realmente está se referindo a um python 2
— Lucas Vazquez

1
@LucasVazquez Isso se refere ao Python 2 (ou 1). Eu o removi porque é irrelevante hoje em dia - mesmo se você escrever um novo código no Python2, poderá usá-lo d.values().
— Phihag 23/09/19

70

No Python 2, você pode evitar fazer uma cópia temporária de todos os valores usando o itervalues()método dictionary, que retorna um iterador das chaves do dicionário:

sum(d.itervalues())

No Python 3, você pode simplesmente usar d.values()porque esse método foi alterado para fazer isso (e itervalues()foi removido porque não era mais necessário).

Para facilitar a gravação de código independente da versão, que sempre repete os valores das chaves do dicionário, uma função de utilitário pode ser útil:

import sys

def itervalues(d):
    return iter(getattr(d, ('itervalues', 'values')[sys.version_info[0]>2])())

sum(itervalues(d))

Isso é essencialmente o que o sixmódulo de Benjamin Peterson faz.


5
yup, embora isto não se aplica para Python 3.
— tokland

15

Claro que existe. Aqui está uma maneira de somar os valores de um dicionário.

>>> d = {'key1':1,'key2':14,'key3':47}
>>> sum(d.values())
62

4
d = {'key1': 1,'key2': 14,'key3': 47}
sum1 = sum(d[item] for item in d)
print(sum1)

você pode fazer isso usando o loop for


3

Eu sinto que sum(d.values())é a maneira mais eficiente de obter a soma.

Você também pode tentar a função reduzir para calcular a soma junto com uma expressão lambda:

reduce(lambda x,y:x+y,d.values())


0

A resposta de phihag (e similares) não funcionará em python3.

Para python 3:

d = {'key1': 1,'key2': 14,'key3': 47}
sum(list(d.values()))

Atualizar! Há queixas de que não funciona! Acabei de anexar uma captura de tela do meu terminal. Pode haver alguma incompatibilidade nas versões etc.

insira a descrição da imagem aqui


Exist mesmo problema, mesmo se nós tentamos desta forma
— jeevan kishore

isso funciona bem para mim! Atualizei minha resposta com uma captura de tela (não é possível fazer aqui); pode ter algo a ver com versões ...
— Reza

0

Você pode considerar 'for loop' para isso:

  d = {'data': 100, 'data2': 200, 'data3': 500}
  total = 0
  for i in d.values():
        total += i

total = 800


1
Ou apenas sum(d.values()), já que .values()retorna a List.
— Linny

Sim, essa é outra maneira também.
— Rahul Patel

-1

Você pode obter um gerador de todos os valores no dicionário, convertê-lo em uma lista e usar a função sum () para obter a soma de todos os valores.

Exemplo:

c={"a":123,"b":4,"d":4,"c":-1001,"x":2002,"y":1001}

sum(list(c.values()))

1
Como isso é uma resposta, se não funcionar. Parece mais um comentário para outras respostas.
— Martin Thøgersen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.