How to convert defaultdict to dict? How to convert defaultdict to dict? python python

How to convert defaultdict to dict?


You can simply call dict:

>>> adefaultdict(<type 'list'>, {'1': ['b', 'a'], '3': ['b'], '2': ['a']})>>> dict(a){'1': ['b', 'a'], '3': ['b'], '2': ['a']}

but remember that a defaultdict is a dict:

>>> isinstance(a, dict)True

just with slightly different behaviour, in that when you try access a key which is missing -- which would ordinarily raise a KeyError -- the default_factory is called instead:

>>> a.default_factory<type 'list'>

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:

>>> 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

but most of the time this isn't worth the trouble.


If your defaultdict is recursively defined, for example:

from collections import defaultdictrecurddict = 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 jsondata = 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.


If you even want a recursive version for converting a recursive defaultdict to a dict you can try the following:

#! /usr/bin/env python3from collections import defaultdictdef 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)