Как я могу преобразовать defaultdict
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
быть общим изречением?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
python
defaultdict
user2988464
источник
источник
dict(number_to_letter)
Ответы:
Вы можете просто позвонить
dict
:>>> a defaultdict(<type 'list'>, {'1': ['b', 'a'], '3': ['b'], '2': ['a']}) >>> dict(a) {'1': ['b', 'a'], '3': ['b'], '2': ['a']}
но помните, что defaultdict - это dict:
>>> isinstance(a, dict) True
просто с немного другим поведением, когда вы пытаетесь получить доступ к отсутствующему ключу - который обычно вызывает a
KeyError
-default_factory
вместо этого вызывается:>>> a.default_factory <type 'list'>
Это то, что вы видите
print a
перед тем, как появится часть словаря с данными.Итак, еще один трюк, чтобы вернуть более диктоподобное поведение без фактического создания нового объекта, - это сбросить
default_factory
:>>> a.default_factory = None >>> a[4].append(10) Traceback (most recent call last): File "<ipython-input-6-0721ca19bee1>", line 1, in <module> a[4].append(10) KeyError: 4
но в большинстве случаев это того не стоит.
источник
default_factory
? Я просто понятия не имею, что происходит. Сожалею.default_factory
- это функция, которую вы передали при созданииdefaultdict
в первую очередь, напримерdefaultdict(int)
илиdefaultdict(list)
. Всякий раз, когда вы пытаетесь найти ключ в словаре, какa['3']
, например, в обычном словаре, вы либо получаете значение, либо возникаетKeyError
исключение (например, ошибка, говорящая вам, что не удалось найти этот ключ). Но в adefaultdict
он вместо этого вызываетdefault_factory
функцию, чтобы установить для вас новое значение по умолчанию (это «default» вdefaultdict
).pickle
(для сохранения объектов Python в файл) не может обрабатыватьdefaultdict
s во многих случаях .Если ваш defaultdict определен рекурсивно, например:
from collections import defaultdict recurddict = lambda: defaultdict(recurddict) data = recurddict() data["hello"] = "world" data["good"]["day"] = True
еще один простой способ преобразовать defaultdict обратно в dict - использовать
json
модульimport json data = json.loads(json.dumps(data))
и, конечно же, значения, содержащиеся в вашем defaultdict, должны быть ограничены поддерживаемыми json типами данных, но это не должно быть проблемой, если вы не собираетесь хранить классы или функции в dict.
источник
Если вам даже нужна рекурсивная версия для преобразования рекурсивной
defaultdict
версии в a,dict
вы можете попробовать следующее:#! /usr/bin/env python3 from collections import defaultdict def ddict(): return defaultdict(ddict) def ddict2dict(d): for k, v in d.items(): if isinstance(v, dict): d[k] = ddict2dict(v) return dict(d) myddict = ddict() myddict["a"]["b"]["c"] = "value" print(myddict) mydict = ddict2dict(myddict) print(mydict)
источник
defaultdict(lambda: defaultdict(int))
):{k: dict(v) for k, v in foo.items()}