从嵌套字典中动态删除项目

Pan*_*pas 6 python dictionary nested

我有一个嵌套字典,我希望能够删除它内部的任意键.

字典可能如下所示:

D={'key1':{'key2':{'key3':'value3', 'key4':'value4'}, 'key5':'value5'}}
Run Code Online (Sandbox Code Playgroud)

但它可能是任意大小的.问题是密钥应该从"密钥列表"中查找,例如,如下所示:

key_list = ['key1', 'key2', 'key4']
Run Code Online (Sandbox Code Playgroud)

key_list 可以是任意大小,并且其中包含任何字典的键.

由于上述标准,我不能只使用:

del D['key1']['key2']['key4']
Run Code Online (Sandbox Code Playgroud)

因为我事先无法知道key_list将包含哪些密钥.

那么,通用代码将如何基于内容key_list,删除字典中的相应项D

iCo*_*dez 6

您可以使用for循环遍历值key_list并导航到要从中删除项目的子词典:

sub = D                 # Start with the full dictionary
for i in key_list[:-1]:
    sub = sub[i]        # Move down a level
Run Code Online (Sandbox Code Playgroud)

最后,sub将是您要更改的字典.你现在需要做的就是:

del sub[key_list[-1]]
Run Code Online (Sandbox Code Playgroud)

因为key_list[-1]是删除的关键.

以下是演示:

>>> D={'key1':{'key2':{'key3':'value3', 'key4':'value4'}, 'key5':'value5'}}
>>> key_list = ['key1', 'key2', 'key4']
>>> sub = D
>>> for i in key_list[:-1]:
...     sub = sub[i]
...
>>> del sub[key_list[-1]]
>>> D
{'key1': {'key5': 'value5', 'key2': {'key3': 'value3'}}}
>>>
Run Code Online (Sandbox Code Playgroud)

如您所见,这相当于:

>>> D={'key1':{'key2':{'key3':'value3', 'key4':'value4'}, 'key5':'value5'}}
>>> del D['key1']['key2']['key4']
>>> D
{'key1': {'key5': 'value5', 'key2': {'key3': 'value3'}}}
>>>
Run Code Online (Sandbox Code Playgroud)

除了解决方案是动态的(没有硬编码密钥).