Python: преобразование defaultdict в dict
Как я могу преобразовать defaultdict
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
быть общим диктом?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
3 ответов
вы можете просто позвонить dict
:
>>> a
defaultdict(<type 'list'>, {'1': ['b', 'a'], '3': ['b'], '2': ['a']})
>>> dict(a)
{'1': ['b', 'a'], '3': ['b'], '2': ['a']}
но помните, что defaultdict и в дикт:
>>> isinstance(a, dict)
True
просто с немного другим поведением, в том, что когда вы пытаетесь получить доступ к ключу, который отсутствует - который обычно вызывает KeyError
-- the default_factory
вызывается:
>>> a.default_factory
<type 'list'>
вот что вы видите, когда вы print a
перед данных словаря появляется.
так еще одна уловка, чтобы получить больше dictlike поведение назад без фактического создания нового объекта-сброс 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
но большую часть времени это не стоит.
Если ваш 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
до 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)