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

时间:2014-11-27 21:07:40

标签: python dictionary nested

我有一个嵌套字典,我希望能够删除其中的任意键。

字典可能如下所示:

D={'key1':{'key2':{'key3':'value3', 'key4':'value4'}, 'key5':'value5'}}

但它可能是任意大小的。问题是密钥应该从“密钥列表”中获取,例如,如下所示:

key_list = ['key1', 'key2', 'key4']

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

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

del D['key1']['key2']['key4']

因为我事先无法知道key_list将包含哪些键。

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

2 个答案:

答案 0 :(得分:6)

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

sub = D                 # Start with the full dictionary
for i in key_list[:-1]:
    sub = sub[i]        # Move down a level

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

del sub[key_list[-1]]

因为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'}}}
>>>

如您所见,这相当于:

>>> D={'key1':{'key2':{'key3':'value3', 'key4':'value4'}, 'key5':'value5'}}
>>> del D['key1']['key2']['key4']
>>> D
{'key1': {'key5': 'value5', 'key2': {'key3': 'value3'}}}
>>>

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

答案 1 :(得分:0)

您可以将嵌套字典视为具有多部分键的字典。如果你改变你的dict,那么你决定何时删除一个元素。如果密钥的一部分位于密钥列表或任何其他标准中。考虑一下:

D={'key1':{'key2':{'key3':'value3', 'key4':'value4', 'key7':{'key8':'value8'}}, 'key5':'value5'}, 'key6': 'value6'}

def multipart_key(d):
    dd = {}
    for k in d:
        if isinstance(d[k], dict):
            inner = multipart_key(d[k])
            for kk in inner:
                dd[k+chr(124)+kk] = inner[kk]
        else:
            dd[k] = d[k]
    return dd

key_list = ['key3', 'key7']

DD = multipart_key(D)
newDD = DD.copy()

for k in DD:
    for kk in k.split(chr(124)):
        if kk in key_list:
            del newDD[k]
            break

print(DD)
# {'key1|key2|key3': 'value3', 'key1|key5': 'value5', 'key6': 'value6', 'key1|key2|key7|key8': 'value8', 'key1|key2|key4': 'value4'}

print(newDD)
# {'key1|key5': 'value5', 'key6': 'value6', 'key1|key2|key4': 'value4'}