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

php中对数组的赋值可以很简单方便,比如:

$array = [];

$array['20161101']['age'] = 20;

$array['20161101']['num'] = 30;

print_r($array);

可以看到,直接进行多层级赋值是可以的,
但是当我使用python的时候,也想这样用:

item = {}

item['20161101']["age"] = 20

item['20161102']['num'] = 30

print item

结果是不行的,报错:KeyError
查了一下资料,知道python中的dict只能直接进行一层的赋值,不支持多层级直接赋值,
所以想问一下,有没有什么方法能够做到多层级赋值呢?

回答:

可以自己实现这个结构。
下面的例子中,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的例子

回答:

我再附上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

回答:

谁说不行了,看我:
1.jpg

以上是 如何为一个dict字典进行多层级赋值? 的全部内容, 来源链接: utcz.com/a/157272.html

回到顶部