加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 11:04:09 所属栏目:Python 来源:网络整理
导读:如何将嵌套字典转换为嵌套的defaultdict? dic = {"a": {"aa": "xxx"}}default = defaultdict(lambda: None,dic)print(default["dummy_key"]) # return Noneprint(default["a"]["dummy_key"]) # KeyError 解决方法 您需要循环或递归嵌套字典,通过其所有级别.
如何将嵌套字典转换为嵌套的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,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))

等等.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读