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.