Как построить defaultdict из словаря?

88

Если у меня есть, d=dict(zip(range(1,10),range(50,61)))как я могу построить collections.defaultdictиз dict?

Единственный аргумент, который, defaultdictпохоже, принимает, - это фабричная функция, мне нужно будет инициализировать, а затем просмотреть оригинал dи обновить defaultdict?

Картик
источник

Ответы:

99

Прочтите документы :

Первый аргумент обеспечивает начальное значение атрибута default_factory; по умолчанию - Нет. Все остальные аргументы обрабатываются так же, как если бы они были переданы конструктору dict , включая аргументы ключевого слова.

from collections import defaultdict
d=defaultdict(int, zip(range(1,10),range(50,61)))

Или дан словарь d:

from collections import defaultdict
d=dict(zip(range(1,10),range(50,61)))
my_default_dict = defaultdict(int,d)
Йохен Ритцель
источник
3
Можно ли распространить этот подход на вложенные диктовки? Следующее работает не так, как задумано: default_dict = defaultdict(None,{"a":1,"b":{"c":3}})например, default_dict["e"]вызывает KeyError вместо возврата None
alancalvitti
4
@alancalvitti, потому что передача Noneне означает, что он не будет генерировать None для неизвестных ключей, он не будет использовать его вообще. Вы должны сделатьdefaultdict(lambda: None, {....})
Эрик Дарчис
3

Вы можете создать defaultdict из dict, передав dict в качестве второго аргумента.

from collections import defaultdict

d1 = {'foo': 17}
d2 = defaultdict(int, d1)

print(d2['foo'])  ## should print 17
print(d2['bar'])  ## should print 1 (default int val )
Мухсин Мухаммед
источник
Какую версию Python вы используете? Значение int val по умолчанию для меня в Python 3.8.3 равно 0, а не 1.
shmulvad
0

defaultdict - это метод из коллекций, который не возвращает ключевую ошибку, когда элемент отсутствует.

Прем
источник