我如何转换defaultdict
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
成为普通命令?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
我如何转换defaultdict
number_to_letter
defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
成为普通命令?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
Answers:
您可以简单地致电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
只是稍有不同的行为,因为当您试图访问一个缺少关键-这通常会提高一个KeyError
-在default_factory
被称为改为:
>>> a.default_factory
<type 'list'>
这就是您print a
在字典的数据端出现之前看到的内容。
因此,在没有实际制作新对象的情况下恢复更多类似dict的行为的另一个技巧是重置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
异常(例如错误,告诉您找不到该键)。但是,在中defaultdict
,它改为调用default_factory
函数为您创建一个新的默认值(即中的“默认值” defaultdict
)。
如果您的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)
defaultdict(lambda: defaultdict(int))
),则使用字典理解是简洁的: {k: dict(v) for k, v in foo.items()}
dict(number_to_letter)