Python 如何将嵌套字典转换为defaultdict?
如何将嵌套字典转换为嵌套defaultdictPython 如何将嵌套字典转换为defaultdict?,python,python-3.x,Python,Python 3.x,如何将嵌套字典转换为嵌套defaultdict dic = {"a": {"aa": "xxx"}} default = defaultdict(lambda: None, dic) print(default["dummy_key"]) # return None print(default["a"]["dummy_key"]) # KeyError 您需要在嵌套字典的所有级别上循环或递归 除非它的深度(如在数百个级别中)可能会达到荒谬的程度,或者范围太广以至于性能因素很小,否则递归在这
dic = {"a": {"aa": "xxx"}}
default = defaultdict(lambda: None, dic)
print(default["dummy_key"]) # return None
print(default["a"]["dummy_key"]) # KeyError
您需要在嵌套字典的所有级别上循环或递归 除非它的深度(如在数百个级别中)可能会达到荒谬的程度,或者范围太广以至于性能因素很小,否则递归在这里可能是最简单的:
def defaultify(d):
if not isinstance(d, dict):
return d
return defaultdict(lambda: None, {k: defaultify(v) for k, v in d.items()})
或者,如果您想让它处理所有映射,而不仅仅是dict,您可以在
isinstance
检查中使用collections.abc.Mapping
而不是dict
当然,这是假设您有一个纯嵌套的dict。如果您有(比如)从典型的JSON响应中解析的内容,其中可能有带有列表值和dict元素的dict,那么您还必须处理其他可能性:
def defaultify(d):
if isinstance(d, dict):
return defaultdict(lambda: None, {k: defaultify(v) for k, v in d.items()})
elif isinstance(d, list):
return [defaultify(e) for e in d]
else:
return d
但是,如果这实际上来自JSON,那么最好在解析JSON时使用defaultdict
,而不是将其解析为dict,然后再将其转换为defaultdict
文档中有一个使用OrderedDict
代替dict
的例子,但这对我们来说不太管用,不像OrderedDict
和dict
,defaultdict
不能仅仅将对的iterable作为其唯一参数;它首先需要默认值factory。因此,我们可以使用以下方法将其绑定到中:
等等。谢谢,它运行得很好。是的,我也有清单,你的建议对我很有帮助。非常感谢。@ MiKooKaWaWa如果你真的从<代码> JSON获得。加载< /代码>或类似,你可能首先要考虑建立一个<代码> Debug Trp< <代码>,而不是首先建立一个<代码> DICT<代码>,然后转换它。例如,解释如何使解码器对每个JSON对象使用
OrderedDict
而不是dict
,您可以做同样的事情使其使用defaultdict
。哦,非常感谢。我试过了,但发生了一个错误。json.loads({“a”:{“aa”:“xxx”}',object_pairs_hook=collections.defaultdict)#TypeError:第一个参数必须是可调用的,或者没有,也许我错了。@MaikoOhkawa你不能只使用defaultdict
,因为它需要一个额外的第一个参数,但你可以使用,例如functools.partial(defaultdict,lambda:None)
,或lambda*args,**kw:defaultdict(lambda:None,*args,**kw)
。我会把它编辑成答案。这很好用,非常感谢!顺便说一下,我为您的上一个示例提交了一个编辑,将object\u hook\u pairs
更改为object\u pairs\u hook
,发现了一个错误并发现了错误销售。
d = json.loads(jsonstring, object_hook_pairs=partial(defaultdict, lambda: None))