Я читал примеры в документации по Python, но до сих пор не могу понять, что означает этот метод. Может кто-нибудь помочь? Вот два примера из документации по 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
для чего?
python
dictionary
default-value
defaultdict
Lanston
источник
источник
default_factory = None
после того, как вы закончили заполнять defaultdict. Смотрите этот вопрос .Ответы:
Как правило, словарь Python выдает a,
KeyError
если вы пытаетесь получить элемент с ключом, которого в данный момент нет в словаре.defaultdict
В отличие от просто создавать любые предметы , которые вы пытаетесь получить доступ ( при условии , конечно , они еще не существуют). Чтобы создать такой элемент «по умолчанию», он вызывает объект функции, который вы передаете конструктору (точнее, это произвольный «вызываемый» объект, который включает объекты функций и типов). Для первого примера элементы по умолчанию создаются с помощьюint()
, который возвращает объект целого числа0
. Во втором примере элементы по умолчанию создаются с использованиемlist()
, который возвращает новый пустой объект списка.источник
d.get(key, default)
никогда не будет изменять ваш словарь - он просто вернет значение по умолчанию и оставит словарь без изменений.defaultdict
с другой стороны, вставит ключ в словарь, если его еще нет. Это большая разница; посмотрите примеры в вопросе, чтобы понять, почему.defaultdict
вызывает любой конструктор, который вы передаете. Если вы передаете тип aT
, значения будут создаваться с использованиемT()
. Не все типы могут быть построены без передачи каких-либо параметров. Если вы хотите создать такой тип, вам нужна функция-оболочка или что-то вроде этогоfunctools.partial(T, arg1, arg2)
.defaultdict
означает, что если в словаре не найден ключ, то вместоKeyError
выбрасывания создается новая запись. Тип этой новой записи определяется аргументом defaultdict.Например:
источник
0
целое число, если этоsomeddict = defaultdict(list)
возвращается[ ]
. 0 является целым числом по умолчанию? Или [] список по умолчанию?0
является неизменным - в CPython все значения от-5
to256
являются кэшированными одиночками, но это поведение, зависящее от реализации - в обоих случаях новый экземпляр «создается» каждый раз с помощьюint()
илиlist()
. Таким образом,d[k].append(v)
можно работать, не заполняя словарь ссылками на тот же список, что сделало быdefaultdict
практически бесполезным. Если бы это было поведениеdefaultdict
, в качестве параметра было бы значение, а не лямбда. (Простите за ужасное объяснение!)defaultdict
«Стандартный словарь включает метод setdefault () для извлечения значения и установления значения по умолчанию, если значение не существует. В отличие от этого,
defaultdict
вызывающая сторона позволяет указать значение по умолчанию (возвращаемое значение) сразу после инициализации контейнера».как определено Дугом Хеллманном в стандартной библиотеке Python на примере
Как использовать defaultdict
Импортировать defaultdict
Инициализировать defaultdict
Инициализируйте его, передав
или
Как это работает
Как и дочерний класс стандартного словаря, он может выполнять все те же функции.
Но в случае передачи неизвестного ключа он возвращает значение по умолчанию вместо ошибки. Например:
Если вы хотите изменить значение по умолчанию перезаписать default_factory:
или
Примеры в вопросе
Пример 1
Так как int был передан как default_factory, любой неизвестный ключ вернет 0 по умолчанию.
Теперь, когда строка передается в цикле, она увеличивает количество этих алфавитов в d.
Пример 2
Поскольку список был передан как default_factory, любой неизвестный (несуществующий) ключ вернет [] (т.е. список) по умолчанию.
Теперь, когда список кортежей передается в цикле, он добавит значение в d [color]
источник
Словари - это удобный способ хранения данных для последующего поиска по имени (ключу). Ключи должны быть уникальными, неизменяемыми объектами и обычно являются строками. Значения в словаре могут быть любыми. Для многих приложений значения являются простыми типами, такими как целые числа и строки.
Это становится более интересным, когда значения в словаре являются коллекциями (списки, dict и т. Д.). В этом случае значение (пустой список или dict) должно быть инициализировано при первом использовании данного ключа. Хотя это относительно легко сделать вручную, тип defaultdict автоматизирует и упрощает подобные операции. Defaultdict работает точно так же, как обычный dict, но он инициализируется функцией («фабрика по умолчанию»), которая не принимает аргументов и предоставляет значение по умолчанию для несуществующего ключа.
Defaultdict никогда не вызовет KeyError. Любой несуществующий ключ получает значение, возвращаемое фабрикой по умолчанию.
Вот еще один пример того, как используя defaultdict, мы можем уменьшить сложность
В заключение, всякий раз, когда вам нужен словарь, и значение каждого элемента должно начинаться со значения по умолчанию, используйте defaultdict.
источник
Здесь есть отличное объяснение дефолтных приговоров: http://ludovf.net/blog/python-collections-defaultdict/
По сути, параметры int и list являются функциями, которые вы передаете. Помните, что Python принимает имена функций в качестве аргументов. int возвращает 0 по умолчанию, а list возвращает пустой список при вызове в скобках.
В обычных словарях, если в вашем примере я попытаюсь позвонить
d[a]
, я получу ошибку (KeyError), поскольку существуют только ключи m, s, i и p, а ключ a не был инициализирован. Но в defaultdict он принимает имя функции в качестве аргумента, когда вы пытаетесь использовать ключ, который не был инициализирован, он просто вызывает функцию, которую вы передали, и назначает ее возвращаемое значение в качестве значения нового ключа.источник
Поскольку вопрос о том, «как это работает», некоторые читатели могут захотеть увидеть больше гаек и болтов. В частности, рассматриваемый метод является
__missing__(key)
методом. См .: https://docs.python.org/2/library/collections.html#defaultdict-objects .Более конкретно, этот ответ показывает, как использовать
__missing__(key)
на практике: https://stackoverflow.com/a/17956989/1593924Чтобы уточнить, что означает «вызываемый», вот интерактивный сеанс (начиная с версии 2.7.6, но также должен работать в версии 3):
Это было наиболее типичное использование defaultdict (за исключением бессмысленного использования переменной x). Вы можете сделать то же самое с 0 в качестве явного значения по умолчанию, но не с простым значением:
Вместо этого работает следующее, потому что оно передает простую функцию (она на лету создает безымянную функцию, которая не принимает аргументов и всегда возвращает 0):
И с другим значением по умолчанию:
источник
Мой собственный 2 ¢: вы также можете подкласс defaultdict:
Это может пригодиться для очень сложных случаев.
источник
Поведение
defaultdict
можно легко имитировать, используяdict.setdefault
вместоd[key]
каждого вызова.Другими словами, код:
эквивалентно:
Единственное отличие состоит в том, что использование
defaultdict
конструктора списка вызывается только один раз, а использованиеdict.setdefault
конструктора списка вызывается чаще (но код может быть переписан во избежание этого, если это действительно необходимо).Некоторые могут возразить, что есть соображение производительности, но эта тема - минное поле. Этот пост показывает, что при использовании defaultdict нет большого прироста производительности.
ИМО, defaultdict - это коллекция, которая добавляет больше путаницы, чем преимуществ к коду. Бесполезно для меня, но другие могут думать иначе.
источник
Инструмент defaultdict - это контейнер в классе коллекций Python. Он похож на обычный контейнер словаря (dict), но имеет одно отличие: тип данных полей значений указывается при инициализации.
Например:
Это печатает:
источник
list
вызывается функция для заполнения пропущенного значения, а не тип создаваемых объектов. Например, чтобы иметь значение по умолчанию1
, вы бы использовали,lambda:1
который явно не является типом.Я думаю, что его лучше использовать вместо оператора case switch. Представьте себе, если у нас есть инструкция переключения регистра, как показано ниже:
В
switch
Python нет доступных регистров. Мы можем достичь того же, используяdefaultdict
.Это печатает:
В приведенном выше фрагменте
dd
нет ключей 4 или 5, и, следовательно, он выводит значение по умолчанию, которое мы настроили во вспомогательной функции. Это гораздо лучше, чем необработанный словарь, в которомKeyError
выбрасывается a, если ключа нет. Из этого очевидно, чтоdefaultdict
больше похоже на оператор переключения регистра, где мы можем избежать сложныхif-elif-elif-else
блоков.Еще один хороший пример, который очень впечатлил меня с этого сайта :
Если мы попытаемся получить доступ к любым элементам, кроме
eggs
иspam
мы получим счет 0.источник
Без
defaultdict
этого вы, вероятно, можете назначить новые значения невидимым ключам, но вы не сможете их изменить. Например:источник
Ну, defaultdict также может вызвать keyerror в следующем случае:
Всегда не забывайте указывать аргумент defaultdict как defaultdict (int).
источник
Стандартный словарь включает метод setdefault () для извлечения значения и установления значения по умолчанию, если значение не существует. В отличие от этого, defaultdict позволяет вызывающей стороне заранее указывать значение по умолчанию при инициализации контейнера.
Это работает хорошо до тех пор, пока все ключи имеют одинаковые значения по умолчанию. Это может быть особенно полезно, если по умолчанию используется тип, используемый для агрегирования или накопления значений, таких как список, набор или даже целое число. Документация стандартной библиотеки включает несколько примеров использования defaultdict таким способом.
источник
Короче говоря:
defaultdict(int)
- аргумент int указывает, что значения будут типом int.defaultdict(list)
- список аргументов указывает, что значения будут иметь тип списка.источник
Документация и объяснения в значительной степени говорят сами за себя:
http://docs.python.org/library/collections.html#collections.defaultdict
Функция типа (int / str и т. Д.), Передаваемая в качестве аргумента, используется для инициализации значения по умолчанию для любого заданного ключа, где ключ отсутствует в dict.
источник