gpt4 book ai didi

python - 如何将嵌套的 python 字典转换为简单的命名空间?

转载 作者:行者123 更新时间:2023-12-05 09:34:52 28 4
gpt4 key购买 nike

假设我有一个深度为 N 的嵌套字典。如何将每个内部嵌套字典转换为一个简单的命名空间?

example_input = {key0a: "test", key0b: {key1a: {key2a: {...keyNx}, key2b: "test"} ,key1b: "test"}}

example_output = SimpleNamespace(key0a: "test", key0b: SimpleNamespace(key1a: SimpleNamespace(key2a: SimpleNamespace(...keyNx), key2b: "test"), key1b: "test"))

如果给出了 example_input 字典,是否有更好的替代方法使字典的键可以按点符号访问(例如 example_input.key0a) - 没有外部依赖性?

最佳答案

2022 答案:现在我发布了一个相对快速的小型库,名为 dotwiz ,它也可以用于为 python dict 对象提供简单的点访问

巧合的是,它应该比其他选项快一点——我添加了一个快速而肮脏的基准代码,我使用下面的 timeit 模块将它们放在一起,同时针对 attrdictSimpleNamespace 方法——后者实际上在时间上表现相当稳定。

Note that I had to modify the parse function slightly, so that it handles nested dicts within a list object, for example.

from timeit import timeit
from types import SimpleNamespace

from attrdict import AttrDict
from dotwiz import DotWiz


example_input = {'key0a': "test", 'key0b': {'key1a': [{'key2a': 'end', 'key2b': "test"}], 'key1b': "test"},
"something": "else"}


def parse(d):
x = SimpleNamespace()
_ = [setattr(x, k,
parse(v) if isinstance(v, dict)
else [parse(e) for e in v] if isinstance(v, list)
else v) for k, v in d.items()]
return x


print('-- Create')
print('attrdict: ', round(timeit('AttrDict(example_input)', globals=globals()), 2))
print('dotwiz: ', round(timeit('DotWiz(example_input)', globals=globals()), 2))
print('SimpleNamespace: ', round(timeit('parse(example_input)', globals=globals()), 2))
print()

dw = DotWiz(example_input)
ns = parse(example_input)
ad = AttrDict(example_input)

print('-- Get')
print('attrdict: ', round(timeit('ad.key0b.key1a[0].key2a', globals=globals()), 2))
print('dotwiz: ', round(timeit('dw.key0b.key1a[0].key2a', globals=globals()), 2))
print('SimpleNamespace: ', round(timeit('ns.key0b.key1a[0].key2a', globals=globals()), 2))
print()

print(ad)
print(dw)
print(ns)

assert ad.key0b.key1a[0].key2a \
== dw.key0b.key1a[0].key2a \
== ns.key0b.key1a[0].key2a \
== 'end'

以下是我的 M1 Mac Pro 笔记本电脑上的结果:

attrdict:          0.69
dotwiz: 1.3
SimpleNamespace: 1.38

-- Get
attrdict: 6.06
dotwiz: 0.06
SimpleNamespace: 0.06

dotwiz 库可以使用 pip 安装:

$ pip install dotwiz

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com