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

标签 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

最佳答案

您需要循环或递归遍历嵌套字典的所有级别。

除非它可能深得离谱(如数百个级别),或者范围如此之广以至于小的性能因素会产生影响,否则递归在这里可能是最简单的:

def defaultify(d):
    if not isinstance(d, dict):
        return d
    return defaultdict(lambda: None, {k: defaultify(v) for k, v in d.items()})

或者,如果您希望它适用于所有映射,而不仅仅是字典,您可以使用 collections.abc.Mapping而不是 dict在你的isinstance检查。


当然这是假设你有一个纯嵌套的字典。比方说,如果您从典型的 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,那么最好只使用你的 defaultdict作为 object_pairs_hook 在解析 JSON 时,而不是先将其解析为字典,然后再将其转换为默认字典。

文档中有一个使用 OrderedDict 的示例代替 dict , 但这对我们来说不太管用——不像 OrderedDictdict , defaultdict不能只将可迭代的对作为唯一的参数;它首先需要默认值工厂。所以我们可以使用 functools.partial 绑定(bind)它:

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

等等。

关于python - 如何将嵌套字典转换为 defaultdict?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50013768/

相关文章:

python - django-mptt:如何成功移动节点

python - 检查特定的声音(输入:麦克风)

python-3.x - 在 BigQuery python api 中设置聚类列

python-3.x - 如何解决 "RuntimeError: Tensors must have same number of dimensions: got 2 and 1"?

python - 更改 python 脚本内的 python 版本环境

python - 从具有多个元素python的列表中返回最大值

python - 在 pandas 数据框中创建增量数字列

python - 根据某些值选择表的某些行

python - xlwings 表示#N/A

python - 将数据框中的行返回到整数列表