Как работает collection.defaultdict? - PullRequest
398 голосов
/ 05 мая 2011

Я читал примеры в документации по Python, но до сих пор не могу понять, что означает этот метод. Может кто-нибудь помочь? Вот два примера из документации по питону

>>> from collections import defaultdict

>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
...     d[k] += 1
...
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]

и

>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
...     d[k].append(v)
...
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

параметры int и list для чего?

Ответы [ 14 ]

1 голос
/ 17 августа 2017

Я думаю, что его лучше использовать вместо оператора case switch. Представьте себе, если у нас есть инструкция переключения регистра, как показано ниже:

option = 1

switch(option) {
    case 1: print '1st option'
    case 2: print '2nd option'
    case 3: print '3rd option'
    default: return 'No such option'
}

В python нет switch операторов case. Мы можем достичь того же, используя defaultdict.

from collections import defaultdict

def default_value(): return "Default Value"
dd = defaultdict(default_value)

dd[1] = '1st option'
dd[2] = '2nd option'
dd[3] = '3rd option'

print(dd[4])    
print(dd[5])    
print(dd[3])

Он печатает:

Default Value
Default Value
3rd option

В приведенном выше фрагменте dd не имеет ключей 4 или 5 и, следовательно, выводит значение по умолчанию, которое мы настроили в вспомогательной функции. Это гораздо лучше, чем необработанный словарь, в котором выдается KeyError, если ключа нет. Из этого очевидно, что defaultdict больше похоже на оператор регистра переключателя, где мы можем избежать сложных if-elif-elif-else блоков.

Еще один хороший пример, который очень впечатлил меня с этого сайта :

>>> from collections import defaultdict
>>> food_list = 'spam spam spam spam spam spam eggs spam'.split()
>>> food_count = defaultdict(int) # default value of int is 0
>>> for food in food_list:
...     food_count[food] += 1 # increment element's value by 1
...
defaultdict(<type 'int'>, {'eggs': 1, 'spam': 7})
>>>

Если мы попытаемся получить доступ к любым элементам, кроме eggs и spam, мы получим счетчик 0.

0 голосов
/ 28 марта 2019

Вкратце:

defaultdict(int) - аргумент int указывает, что значения будут иметь тип int.

defaultdict(list) - список аргументов указывает, что значения будут иметь тип списка.

0 голосов
/ 30 декабря 2014

Стандартный словарь включает метод setdefault () для извлечения значения и установления значения по умолчанию, если значение не существует. В отличие от этого, defaultdict позволяет вызывающей стороне заранее указывать значение по умолчанию при инициализации контейнера.

import collections

def default_factory():
    return 'default value'

d = collections.defaultdict(default_factory, foo='bar')
print 'd:', d
print 'foo =>', d['foo']
print 'bar =>', d['bar']

Это работает хорошо до тех пор, пока все ключи имеют одинаковые значения по умолчанию. Это может быть особенно полезно, если по умолчанию используется тип, используемый для агрегирования или накопления значений, таких как список, набор или даже int. Документация стандартной библиотеки включает несколько примеров использования defaultdict таким образом.

$ python collections_defaultdict.py

d: defaultdict(<function default_factory at 0x100468c80>, {'foo': 'bar'})
foo => bar
bar => default value
0 голосов
/ 05 мая 2011

Документация и объяснения в значительной степени говорят сами за себя:

http://docs.python.org/library/collections.html#collections.defaultdict

Функция типа (int / str и т. Д.), Переданная в качестве аргумента, используется для инициализации значения по умолчанию для любого заданного ключа, где ключ отсутствует в dict.

...