python - 如何为一个dict字典进行多层级赋值?
ringa_lee
ringa_lee 2017-04-18 10:07:26
0
2
1532
ringa_lee
ringa_lee

ringa_lee

全部回覆(2)
大家讲道理

可以自己實現這個結構。
下面的例子中,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類型。 collections.defaultdict 类型,该类型可以自定义扩展性更强大的dict类型。
文档中指出,其实现原理就是重载了 __missing__文件中指出,其實作原理就是重載了

方法。 AutoVivification 也可以如是表達:

item = defaultdict(dict)  # 其实现与AutoVivification的实现完全一样
item['20161101']["age"] = 20
item['20161102']['num'] = 30
print item
__missing__defaultdict 建構了一個dict類型,其第一個參數是它的default_factory,當
被呼叫時,使用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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板