以编程方式访问字典中任意深度嵌套的值

时间:2015-06-04 15:41:41

标签: python search dictionary

我正在处理一个Python脚本,我在其中给出了格式为DigestiveBiscuitTransformer的字符串列表。

列表中的每个值对应于字典中的条目,对于结构类似['key1', 'key2', 'key2.key21.key211', 'key2.key22', 'key3']的条目,它们对应于(在此示例中)'key2.key21.key211'嵌套在'key211'内的键'key21' ,它本身嵌套在'key2'内。

上面的列表对应于字典:

x = {
     'key1' : 'value1',
     'key2' : {
               'key21' : {
                          'key211': 'value211'
                         },
               'key22' : 'value22'
              },
     'key3' : 'value3'
    }

名称不一定与key(n)+一样规则;例如,它们可以是food.vegetables.potato的形式。我唯一的保证是字典中的键名称不包含.字符,并且字典肯定包含原始列表中引用的所有条目。

我的问题是,给定这样的字符串列表,我如何以编程方式访问字典中的相应条目?我可以考虑使用eval()的解决方案,以及仅使用遍历/搜索的解决方案,但我想避免调用eval(),并且我得到的印象是,进行比较的遍历会很慢(因为dict s不搜索树),并且需要进行大量令人讨厌的异常处理。

1 个答案:

答案 0 :(得分:5)

一种方法是编写一个函数来访问嵌套dicts中的键。

value211

结果:

dict

另一种方法,如果你想使用与普通字典访问类似的语法,你可以继承__getitem__并覆盖class NestedDict(dict): def __getitem__(self,keytuple): # if key is not a tuple then access as normal if not isinstance(keytuple, tuple): return super(NestedDict,self).__getitem__(keytuple) d = self for key in keytuple: d = d[key] return d >>> nd = NestedDict(x) >>> nd['key2'] {'key22': 'value22', 'key21': {'key211': 'value211'}} >>> nd['key2','key22'] 'value22' >>> nd['key2','key21'] {'key211': 'value211'} >>> nd['key2','key21','key211'] 'value211' ,以便在提供密钥元组时允许嵌套访问:

__setitem__

然后,您可以根据需要同样实施__delitem__和{{1}}。