2015-08-05 2 views
1

Аналогично this question Я хотел бы создать collections.defaultdict со значением по умолчанию, равным нулю для подсчета элементов списка кортежей:Создать defaultdict значение по умолчанию равно нулю (0)

tuples = [('foo', 5), ('foo', 5), ('bar', -5), ('bar', -2)] 
totals = defaultdict(0) 
for t in tuples: 
    totals[t[0]] += t[1] 

Но defaultdict(0) говорит :

TypeError: first argument must be callable 

Как я могу создать «вызываемый» ноль?

+0

Также обратите внимание на то, что здесь также рассматривается множество других вопросов: пример 'defaultdict (int) приведен в [документации] (https://docs.python.org/2/library /collections.html#defaultdict-examples)*, поэтому я действительно не уверен, что это добавляет ценность. – jonrsharpe

+0

@jonrsharpe Это упоминание в документах является более мощным аргументом для закрытия, чем дублированный вопрос, с которым вы связались, хотя это является дополнением к этому, и не имеет достаточной возможности для Google. У меня есть тенденция делать эти вопросы в стиле Q & A всякий раз, когда docstring непрозрачна, и быстрый Google не мгновенно приносит радость! – LondonRob

ответ

2

строка документация для collections.defaultdict довольно запутанный первого прочтение:

defaultdict (default_factory [, ...]) -> ДИКТ с заводом по умолчанию

завод по умолчанию вызывается без аргументов производят новое значение , когда ключа нет, в getitem. Значение defaultdict сравнивает , равное dict с теми же элементами. Все остальные аргументы: обрабатываются так же, как если бы они были переданы конструктору dict, , включая аргументы ключевых слов.

Все это пытается сказать, что «значение» по умолчанию должен быть функцией, и что эта функция будет вызвана без аргументов, когда это необходимо (например, когда нормальная dict поднимет KeyError). В docstring ссылается на эту функцию как default_factory.

В бит с [, ...] указано, что вы можете дополнительно передать объект (или ключевые слова) для использования в качестве начального словаря defaultdict. Таким образом:

In [26]: x = defaultdict(lambda: 0, a=1, b=2) 

In [28]: dict(x) 
Out[28]: {'a': 1, 'b': 2} 

In [29]: x['c'] # This would normally raise a `KeyError` 
Out[29]: 0 

In [30]: dict(x) # But here it just adds a new key! 
Out[30]: {'a': 1, 'b': 2, 'c': 0} 

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

In [31]: int() 
Out[31]: 0 

Таким образом, согласно the counting example from the docs вы можете создать defaultdict со значением по умолчанию нуля с:

defaultdict(int) 
Смежные вопросы