python怎么生成一个嵌套字典,不想使用defaultdict实现

比如原生的dict属性

test=dict()
test['a']=1         # 这个可以实现
test['x']['y']=2    # 这个就会报错

我想生成一个递归字典,如果没有这个键则创建,哪种方法能简洁点,优雅点~~多谢了

阅读 7k
4 个回答

这样会有一些问题.
test["x"]["y"]相当于一个链式调用,先获取test["x"],再对["y"]这个key进行赋值,进行第一步的时候你无法获取后边是不是要进行赋值,你只能在每次getitem的时候都创建不存在的键.
创建这个键究竟是什么类型的呢?默认是dict当然很好理解,但是如果他y的位置是一个整数,那要不要创建一个列表呢?
这些你都要考虑清楚.
最后是一个简单的实现.完全不考虑list的情况.

# coding:utf-8
class MyDict(dict):
    # mydict 可还行

    def __getitem__(self, a):
        if not hasattr(self, a):
            self[a] = MyDict() # 注意这个位置也要生成同样的类型
        return super(MyDict, self).__getitem__(a)


test = MyDict()

test["a"]["b"]["c"] = 1

print test
# {'a': {'b': {'c': 1}}}

我觉得这种简单的设计虽然用起来看似简单,但是局限性也是存在的,一定要小心使用这种trick.

花括号的初始化方法更合适


>>> test={'x':{'y':123}}
>>> 
>>> test['x']['y']
123

自己写一个类,继承dict,重写__setitem__方法,来实现你的自动创建递归字典。

不考虑通用的情况,就你这个例子来说:

test=dict()
test['a']=1
x = {"y":2}         
test['x'] = x   
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题