How can I convert a defaultdict
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
to be a common dict
?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
How can I convert a defaultdict
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
to be a common dict
?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
If you even want a recursive version for converting a recursive defaultdict
to a dict
you can try the following:
#! /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)
If your defaultdict is recursively defined, for example:
from collections import defaultdict
recurddict = lambda: defaultdict(recurddict)
data = recurddict()
data["hello"] = "world"
data["good"]["day"] = True
yet another simple way to convert defaultdict back to dict is to use json
module
import json
data = json.loads(json.dumps(data))
and of course, the values contented in your defaultdict need to be confined to json supported data types, but it shouldn't be a problem if you don't intent to store classes or functions in the dict.
You can simply call
dict
:but remember that a defaultdict is a dict:
just with slightly different behaviour, in that when you try access a key which is missing -- which would ordinarily raise a
KeyError
-- thedefault_factory
is called instead:That's what you see when you
print a
before the data side of the dictionary appears.So another trick to get more dictlike behaviour back without actually making a new object is to reset
default_factory
:but most of the time this isn't worth the trouble.