python defaultdict 递归_python – 如何将嵌套字典转换为defaultdict?

如何将嵌套字典转换为嵌套的defaultdict?

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

或者,如果您希望它与所有映射一起使用,而不仅仅是dicts,您可以在isinstance检查中使用collections.abc.Mapping而不是dict.

当然这假设你有一个纯粹的嵌套字典.如果您已经从一个典型的JSON响应中解析了一些内容,那里可能存在带有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作为object_pairs_hook,而不是将其解析为dict,然后将其转换为defaultdict.

在使用OrderedDict代替dict的文档中有一个例子,但这对我们来说不太适用 – 与OrderedDict和dict不同,defaultdict不能只将一对迭代的对作为其唯一的参数;它首先需要默认值工厂.所以我们可以使用functools.partial绑定它:

d = json.loads(jsonstring, object_hook_pairs=partial(defaultdict, lambda: None))

等等.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值