ringa_lee
可以自己实现这个结构。下面的例子中,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__魔术方法。当做扩展吧。
__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 也可以如是表达:
collections.defaultdict
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
可以自己实现这个结构。
下面的例子中,AutoVivification 继承自 dict
我们可以这样子来使用AutoVivification:
输出:
补充,AutoVivification还有另一种实现方法,直接重载dict的
__missing__
魔术方法。当做扩展吧。再补充一个,Python2.5 之后的版本增加了
collections.defaultdict
类型,该类型可以自定义扩展性更强大的dict类型。文档中指出,其实现原理就是重载了
__missing__
方法。AutoVivification 也可以如是表达:defaultdict 构造了一个dict类型,其第一个参数是它的default_factory,当
__missing__
被调用时,使用default_factory 构造了返回值。更多defaultdict的例子
我再附上defaultdict包的用法吧:
输出:
这样就可以达到想要的效果了,
补充:
defaultdict()接收一个默认参数,这个参数可以是类型名称,也可以是任何不带参数的可调用函数
这个挺好用的
输出: