如何将违约转换为判决?

如何转换 defaultdict

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

成为一个普通的 dict

{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
86322 次浏览

你可以简单地拨打 dict:

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

但请记住,一个默认判决 一个判决:

>>> 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转换成一个 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)

如果您的默认值是递归定义的,例如:

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

当然,您的默认结果中包含的值需要限制在 json 支持的数据类型中,但是如果您不打算在结果中存储类或函数,那么这应该不是问题。