2011-02-02 3 views
129

Скажем, у меня есть словарь, в котором ключи карты для целых чисел, как:Как суммировать все значения в словаре?

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

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

+2

Просто для удовольствия: реализовать 'sum' самостоятельно в терминах' 'сокращение'' (http://docs.python.org/library/functions.html) -' reduce' является более общей формой (например, ' sum', 'min' и' max' могут быть записаны в терминах 'reduce') и могут легко решить другие проблемы (например,' product'). –

+1

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

ответ

253

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

sum(d.values()) 

В Python < 3, вы можете использовать вместо itervalues (который не создает временный список).

+0

Хорошо, 'Python 2.7.12' также хорошо работает с' sum (d.values ​​()) ' – LancelotHolmes

+5

@LancelotHolmes Да, но это создает список в памяти и, следовательно, может быть медленнее/ближе к ограничениям ресурсов для больших словарей. Таким образом, этот ответ говорит, что «вы * можете * хотеть использовать» вместо «вы * должны * использовать» при обсуждении Python 2. – phihag

11

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

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

В 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 модуля Бенджамина Петерсона.

+4

yup, хотя это не относится к python 3. – tokland

Смежные вопросы