首頁  >  問答  >  主體

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

ringa_leeringa_lee2740 天前1473

全部回覆(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類型。 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的例子🎜

    回覆
    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
  • 取消回覆