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類型。 collections.defaultdict 类型,该类型可以自定义扩展性更强大的dict类型。文档中指出,其实现原理就是重载了 __missing__文件中指出,其實作原理就是重載了
collections.defaultdict
item = defaultdict(dict) # 其实现与AutoVivification的实现完全一样 item['20161101']["age"] = 20 item['20161102']['num'] = 30 print item
我再附上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 之後的版本增加了
方法。 AutoVivification 也可以如是表達:collections.defaultdict
類型,該類型可以自訂擴展性更強大的dict類型。collections.defaultdict
类型,该类型可以自定义扩展性更强大的dict类型。文档中指出,其实现原理就是重载了
__missing__
文件中指出,其實作原理就是重載了__missing__
defaultdict 建構了一個dict類型,其第一個參數是它的default_factory,當被呼叫時,使用default_factory 建構了傳回值。 更多defaultdict的例子🎜
我再附上defaultdict包的用法吧:
輸出:
這樣就可以達到想要的效果了,
補充:
defaultdict()接收一個預設參數,這個參數可以是型別名稱,也可以是任何不帶參數的可呼叫函數
這個挺好用的
輸出: