Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将Python字典转换为对象?

将Python字典转换为对象?

提问于 2017-12-18 09:53:56
回答 2关注 0查看 2.2K

我正在寻找一个优雅的方式来转换一个正常的Python字典与一些嵌套的字典到一个对象。

例如:

代码语言:txt
AI代码解释
复制
>>> d = {'a': 1, 'b': {'c': 2}, 'd': ["hi", {'foo': "bar"}]}
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
应该可以这样访问:
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
>>> x = dict2obj(d)
代码语言:txt
AI代码解释
复制
>>> x.a
代码语言:txt
AI代码解释
复制
1
代码语言:txt
AI代码解释
复制
>>> x.b.c
代码语言:txt
AI代码解释
复制
2
代码语言:txt
AI代码解释
复制
>>> x.d[1].foo
代码语言:txt
AI代码解释
复制
ba

我认为,这是不可能没有递归,但什么是一个很好的方式来获得一个对象的风格的字典?

回答 2

蓝骑士纵横天下

发布于 2017-12-18 10:03:03

代码语言:txt
AI代码解释
复制
class obj(object):
代码语言:txt
AI代码解释
复制
    def __init__(self, d):
代码语言:txt
AI代码解释
复制
        for a, b in d.items():
代码语言:txt
AI代码解释
复制
            if isinstance(b, (list, tuple)):
代码语言:txt
AI代码解释
复制
               setattr(self, a, [obj(x) if isinstance(x, dict) else x for x in b])
代码语言:txt
AI代码解释
复制
            else:
代码语言:txt
AI代码解释
复制
               setattr(self, a, obj(b) if isinstance(b, dict) else b)
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
>>> d = {'a': 1, 'b': {'c': 2}, 'd': ["hi", {'foo': "bar"}]}
代码语言:txt
AI代码解释
复制
>>> x = obj(d)
代码语言:txt
AI代码解释
复制
>>> x.b.c
代码语言:txt
AI代码解释
复制
2
代码语言:txt
AI代码解释
复制
>>> x.d[1].foo
代码语言:txt
AI代码解释
复制
'bar'

不知雨

发布于 2017-12-18 10:01:57

在Python 2.6及更高版本中,考虑namedtuple数据结构是否适合你的需求:

代码语言:txt
AI代码解释
复制
>>> from collections import namedtuple
代码语言:txt
AI代码解释
复制
>>> MyStruct = namedtuple('MyStruct', 'a b d')
代码语言:txt
AI代码解释
复制
>>> s = MyStruct(a=1, b={'c': 2}, d=['hi'])
代码语言:txt
AI代码解释
复制
>>> s
代码语言:txt
AI代码解释
复制
MyStruct(a=1, b={'c': 2}, d=['hi'])
代码语言:txt
AI代码解释
复制
>>> s.a
代码语言:txt
AI代码解释
复制
1
代码语言:txt
AI代码解释
复制
>>> s.b
代码语言:txt
AI代码解释
复制
{'c': 2}
代码语言:txt
AI代码解释
复制
>>> s.c
代码语言:txt
AI代码解释
复制
Traceback (most recent call last):
代码语言:txt
AI代码解释
复制
  File "<stdin>", line 1, in <module>
代码语言:txt
AI代码解释
复制
AttributeError: 'MyStruct' object has no attribute 'c'
代码语言:txt
AI代码解释
复制
>>> s.d
代码语言:txt
AI代码解释
复制
['hi']

备选(原始答案内容)是:

代码语言:txt
复制
代码语言:txt
AI代码解释
复制
class Struct:
代码语言:txt
AI代码解释
复制
    def __init__(self, **entries):
代码语言:txt
AI代码解释
复制
        self.__dict__.update(entries)
代码语言:txt
AI代码解释
复制
那么,你可以使用:
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
>>> args = {'a': 1, 'b': 2}
代码语言:txt
AI代码解释
复制
>>> s = Struct(**args)
代码语言:txt
AI代码解释
复制
>>> s
代码语言:txt
AI代码解释
复制
<__main__.Struct instance at 0x01D6A738>
代码语言:txt
AI代码解释
复制
>>> s.a
代码语言:txt
AI代码解释
复制
1
代码语言:txt
AI代码解释
复制
>>> s.b
代码语言:txt
AI代码解释
复制
2
和开发者交流更多问题细节吧,去 写回答
相关文章

相似问题

复杂字典转CSV格式,求大神?

098

求大神,多重嵌套字典怎么转CSV?

0112

python:如何遍历字典列表?

2899

如何使用jQuery将JS对象转换为数组?

31.9K

Python合并列表成字典?

1126
相关问答用户
新浪微博 | 高级总监擅长4个领域
腾讯云TDP | 产品KOL擅长5个领域
擅长5个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档