2017-08-14 125 views
2

我有Python的字典鍵保存列表:深套Python字典

['level_one', 'level_two', 'test']

這是一本字典的鍵:

mydict = { 
    'level_one' : { 
     'level_two' : { 
      'test' : "Hello World" 
     } 
    } 
} 

通常我可以設置test鍵像這個:

mydict['level_one']['level_two']['test'] = "Hello StackOverflow"

不幸的是,這個列表/字典是即時生成的,我不知道它有多深。有沒有可能通過鍵列表更新字典鍵而不使用大括號?

我只能夠反映此功能,獲取字符串:

def deepGet(sourceDict, *keys): 
    return reduce(lambda d, k: d.get(k) if d else None, keys, sourceDict) 

> deepGet(mydict, *['level_one', 'level_two', 'test']) 
>> Hello World 

不是重複。這是關於設置,而不是獲取嵌套字典。

+1

'pop()'列表的最後一項,使用你的'deepGet'並在結果'dict'上設置彈出鍵。 –

+0

@KlausD。聽起來像一個想法!我會試一下 :-) –

回答

3

我們需要一個defaultdict,它將不斷創建自己的新實例。

import collections 

recursive_dict = lambda: collections.defaultdict(recursive_dict) 

mydict = recursive_dict() 

在這一點上,您可以簡化deepGet只使用operator.getitem,而不是你現在的拉姆達。 operator.getitem對於lambda a, b: a[b]是「速記」。

至於設置一個鍵,就可以只寫一個循環:

keys = ['level_one', 'level_two', 'test'] 
d = mydict 
for key in keys[:-1]: 
    d = d[key] 
d[keys[-1]] = 'Hello World' 

如果字典丟失,defaultdict會默默地創建它們,無需首先檢查他們。

將此轉換爲reduce()調用是讀者的練習。