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


239

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

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

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


2
Просто для удовольствия: реализовать sumсебя в терминах reduce- reduceэто более общая форма (например sum, minи maxвсе можно написать в терминах reduce) и может легко решить другие проблемы (например product).

1
Как насчет высказываний Гвидо - думаю, я правильно это помню - что снижение уходит? Я с тобой. Зачем удалять это из языка?
octopusgrabbus

Ответы:


472

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

sum(d.values())

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


3

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

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

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


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

1
Как это ответ, если он не работает. Больше похоже на комментарий к другим ответам.
Мартин Тёгерсен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.