Python:将defaultdict转换为字典

我如何转换defaultdict

number_to_letter defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']}) 

成为一个共同的字典?

 {'2': ['a'], '3': ['b'], '1': ['b', 'a']} 

你可以简单地调用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 – 而是调用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 

但大部分时间这是不值得的麻烦。

如果您的defaultdict是recursion定义的,例如:

 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支持的数据types中,但是如果你不打算在dict中存储类或函数,这应该不成问题。

如果你甚至想要一个recursion的defaultdict转换为dict的recursion版本,你可以尝试下面的代码:

 #! /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)