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?

nedblorf
fonte
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())
phihag
fonte
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.

Martineau
fonte
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
vz0
fonte
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

Kalyan Pendyala
fonte
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())
Pratyush Raizada
fonte
1

sum (d.values ​​()) - "d" -> Seu dicionário Variável

Behlul Valiyev
fonte
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

Reza
fonte
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

Rahul Patel
fonte
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()))
user12988654
fonte
1
Como isso é uma resposta, se não funcionar. Parece mais um comentário para outras respostas.
Martin Thøgersen