2024-05-16 04:25:37 发布
网友
如何转换defaultdict
number_to_letter defaultdict(<class 'list'>, {'2': ['a'], '3': ['b'], '1': ['b', 'a']})
成为一个普通的口头禅?
{'2': ['a'], '3': ['b'], '1': ['b', 'a']}
如果您甚至需要递归版本来将递归defaultdict转换为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)
您只需调用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:
KeyError
default_factory
>>> a.default_factory <type 'list'>
这就是你在字典的数据端出现之前看到的。
因此,在不实际创建新对象的情况下恢复更多听写行为的另一个技巧是重置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,例如:
from collections import defaultdict recurddict = lambda: defaultdict(recurddict) data = recurddict() data["hello"] = "world" data["good"]["day"] = True
将defaultdict转换回dict的另一个简单方法是使用json模块
json
import json data = json.loads(json.dumps(data))
当然,defaultdict中满足的值需要限制在json支持的数据类型中,但如果不打算在dict中存储类或函数,就不应该有问题
如果您甚至需要递归版本来将递归
defaultdict
转换为dict
,您可以尝试以下操作:您只需调用
dict
:但请记住,defaultdict是一个dict:
只是行为稍有不同,当您尝试访问丢失的密钥(通常会引发一个
KeyError
)时,会调用default_factory
:这就是你在字典的数据端出现之前看到的。
因此,在不实际创建新对象的情况下恢复更多听写行为的另一个技巧是重置
default_factory
:但大多数时候这不值得你费心。
如果以递归方式定义defaultdict,例如:
将defaultdict转换回dict的另一个简单方法是使用
json
模块当然,defaultdict中满足的值需要限制在json支持的数据类型中,但如果不打算在dict中存储类或函数,就不应该有问题
相关问题 更多 >
编程相关推荐