2017-08-14 67 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()调用是读者的练习。