Як підсумовувати всі значення у словнику?


239

Скажімо, у мене є словник, в якому ключі відображаються на цілі числа:

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

Чи є синтаксичний мінімалістичний спосіб повернути суму значень в d-ie 62в цьому випадку?


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

1
Як щодо висловлювання Гуйдо - я думаю, що я це правильно пам’ятаю - це зменшення скорочується? Я з тобою. Навіщо видаляти його з мови?
восьминоги граббус

Відповіді:


471

Як ви і очікували:

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().
фігаг

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(lambda x,y:x+y,d.values())


0

Відповідь фігага (і подібні) не буде працювати в python3.

Для пітона 3:

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

Оновлення! Є скарги, що це не працює! Я просто додаю скріншот зі свого терміналу. Може бути якась невідповідність у версіях тощо.

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


Це ж питання існує, навіть якщо ми спробуємо так
jeevan kishore

це просто добре працює для мене! Я оновив свою відповідь скріншотом (не можу це зробити тут); це може мати щось спільне з версіями ...
Reza

0

Ви можете розглянути "для циклу" для цього:

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

всього = 800


1
Або просто sum(d.values()), оскільки .values()повертає a 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.