Как сложить все значения в словаре?

239

Допустим, у меня есть словарь, в котором ключи отображаются на целые числа, такие как:

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

Есть ли синтаксически минималистичный способ вернуть сумму значений в d-ie 62в этом случае?

nedblorf
источник
2
Просто для удовольствия: реализовать sumсебя в терминах reduce- reduceэто более общая форма (например sum, minи maxвсе можно написать в терминах reduce) и может легко решить другие проблемы (например product).
1
Как насчет высказываний Гвидо - думаю, я правильно это помню - что снижение уходит? Я с тобой. Зачем удалять это из языка?
octopusgrabbus

Ответы:

472

Как и следовало ожидать:

sum(d.values())
phihag
источник
1
Ну, Python 2.7.12также хорошо работает сsum(d.values())
LancelotHolmes
7
@LancelotHolmes Да, но это создает список в памяти и, таким образом, может быть медленнее / ближе к ограничениям ресурсов для больших словарей. Таким образом, в этом ответе говорится «вы можете использовать» вместо «вы должны использовать» при обсуждении Python 2.
phihag
Ницца! Я искал это только потому, что знал, что будет что-то подобное. Не то, чтобы написать мертвый глупый цикл хотя бы слишком много;)
runlevel0
Я не знаю, любишь ли ты питона, любишь ли ты питона 3 или действительно
Лукас Васкес
1
@LucasVazquez Это относится к Python 2 (или 1). Я удалил его, так как в настоящее время он не имеет значения - даже если вы пишете новый код на Python2, вы можете использовать его d.values().
Phihag
70

В Python 2 вы можете избежать создания временной копии всех значений, используя itervalues()метод словаря, который возвращает итератор ключей словаря:

sum(d.itervalues())

В Python 3 вы можете просто использовать, d.values()потому что этот метод был изменен, чтобы сделать это (и itervalues()был удален, так как он больше не нужен).

Чтобы упростить написание независимого от версии кода, который всегда перебирает значения ключей словаря, может быть полезна служебная функция:

import sys

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

sum(itervalues(d))

По сути, это то, что sixделает модуль Бенджамина Петерсона .

Мартино
источник
5
да, хотя это не относится к Python 3.
Tokland
15

Конечно, есть. Вот способ суммировать значения словаря.

>>> d = {'key1':1,'key2':14,'key3':47}
>>> sum(d.values())
62
vz0
источник
4
d = {'key1': 1,'key2': 14,'key3': 47}
sum1 = sum(d[item] for item in d)
print(sum1)

Вы можете сделать это с помощью цикла for

Калян Пендяла
источник
3

Я считаю, sum(d.values())что это самый эффективный способ получить сумму.

Вы также можете попробовать функцию Reduce для вычисления суммы вместе с лямбда-выражением:

reduce(lambda x,y:x+y,d.values())
Пратюш Раиза
источник
1

sum (d.values ​​()) - "d" -> Ваш словарь Переменная

Бехлул Валиев
источник
0

Ответ phihag (и аналогичные) не будет работать в python3.

Для питона 3:

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

Обновить! Есть жалобы, что это не работает! Я просто прикрепляю скриншот из моего терминала. Может быть некоторое несоответствие в версиях и т. Д.

введите описание изображения здесь

Реза
источник
Та же проблема существует, даже если мы попробуем этот путь
Дживан Кишор
это просто отлично работает для меня! Я обновил свой ответ со скриншотом (не могу сделать это здесь); это может быть связано с версиями ...
Реза
0

Вы можете рассмотреть 'для цикла' для этого:

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

всего = 800

Рахул Патель
источник
1
Или просто sum(d.values()), так как .values()возвращает List.
Линни
да, это еще один способ.
Рахул Патель
-1

Вы можете получить генератор всех значений в словаре, затем преобразовать его в список и использовать функцию sum (), чтобы получить сумму всех значений.

Пример:

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

sum(list(c.values()))
user12988654
источник
1
Как это ответ, если он не работает. Больше похоже на комментарий к другим ответам.
Мартин Тёгерсен