登录

python - 如何为一个dict字典进行多层级赋值?

# Python
ringa_leeringa_lee2139 天前1060 次浏览

全部回复(2) 我要回复

  • 大家讲道理

    大家讲道理2017-04-18 10:09:26

    可以自己实现这个结构。
    下面的例子中,AutoVivification 继承自 dict

    class AutoVivification(dict):
        """Implementation of perl's autovivification feature."""
        def __getitem__(self, item):
            try:
                return dict.__getitem__(self, item)
            except KeyError:
                value = self[item] = type(self)()
                return value
                

    我们可以这样子来使用AutoVivification:

    item = AutoVivification()
    item['20161101']["age"] = 20
    item['20161102']['num'] = 30
    print item
    

    输出:

    {'20161101': {'age': 20}, '20161102': {'num': 30}}
    

    补充,AutoVivification还有另一种实现方法,直接重载dict的__missing__魔术方法。当做扩展吧。

    class AutoVivification(dict):
        """Implementation of perl's autovivification feature."""
        def __missing__(self, key):
            value = self[key] = type(self)()
            return value
            

    再补充一个,Python2.5 之后的版本增加了 collections.defaultdict 类型,该类型可以自定义扩展性更强大的dict类型。
    文档中指出,其实现原理就是重载了 __missing__ 方法。AutoVivification 也可以如是表达:

    item = defaultdict(dict)  # 其实现与AutoVivification的实现完全一样
    item['20161101']["age"] = 20
    item['20161102']['num'] = 30
    print item
    

    defaultdict 构造了一个dict类型,其第一个参数是它的default_factory,当 __missing__被调用时,使用default_factory 构造了返回值。
    更多defaultdict的例子

    回复
    0
  • PHP中文网

    PHP中文网2017-04-18 10:09:26

    我再附上defaultdict包的用法吧:

    from collections import defaultdict
    
    item = defaultdict(dict)
    item['20161101']['age'] = 20
    print item

    输出:

    defaultdict(<type 'dict'>, {'20161101': {'age': 20}})

    这样就可以达到想要的效果了,

    补充:
    defaultdict()接收一个默认参数,这个参数可以是类型名称,也可以是任何不带参数的可调用函数
    这个挺好用的

    item = defaultdict(lambda:0)
    print item['num']

    输出:

    0

    回复
    0
  • 取消回复发送