如何从一个深度嵌套的字典中删除

时间:2014-01-27 19:48:58

标签: python dictionary

我有一个使用NestedDict类的代码:How can I access a deeply nested dictionary using tuples?。 “我有一个基于@JCash答案的完整工作示例:”

我想用它做两件事会给我带来麻烦。首先,如果该元素的值为零,我想删除其中一个元素。第二,如果一个元素是一个空字典,因为该字典的所有条目都被删除了,我想删除空字典。

使用上面的类,示例如下:

my_tuple = (0, 1, 0, 0, 0, 1, 0, 0)
d = NestedDict()
print d
d[my_tuple] = 4
print d

#del d[my_tuple]

del d[0][1][0][0][0][1][0][0]
del d[0][1][0][0][0][1][0]
del d[0][1][0][0][0][1]
del d[0][1][0][0][0]
del d[0][1][0][0]
del d[0][1][0]
del d[0][1]
del d[0]

print d

为了摆脱多层次的嵌套,必须使用长列表。注释掉的del语句(给出键错误)是我想要实现的,具有任意长度的元组。

一旦我弄清楚如何删除第一个,那么删除中间级别应该不难。我已经知道要删除的内容了,我可以使用以下命令测试空字典:if(字典条目)== {})

有什么想法吗?

编辑:输出为:

{}
{0: {1: {0: {0: {0: {1: {0: {0: 4}}}}}}}}
{}

1 个答案:

答案 0 :(得分:3)

创建一个函数deepdelete,它接受​​一个键列表并递归删除叶子,然后是任何现在为空的分支词典:

def deepdelete(branch, keys):
    if len(keys) > 1:                                  # not at the leaf
        empty = deepdelete(branch[keys[0]], keys[1:])  # recursion
        if empty:                                      
            del branch[keys[0]]                        # delete branch
    else:                                              # at the leaf
        del branch[keys[0]]                            # delete the leaf
    return len(branch) == 0                            # could return len

deepdelete(d, delkeys)

传入你给出的字典作为例子:

d = {0: {1: {0: {0: {0: {1: {0: {0: 4}}}}}}}}
deepdelete(d, (0, 1, 0, 0, 0, 1, 0, 0))

输出:

{}

与其他分支传递更有趣的字典:

d = {0: {1: {0: {0: {0: {1: {0: {0: 4}}, 'no_delete': 2}, 'other_data': 3}, 'keep_me': 4}, 'special': 4}, 'preserve': 1}, 'important': 50}
deepdelete(d, (0, 1, 0, 0, 0, 1, 0, 0))

输出:

{0: {'preserve': 1, 1: {0: {0: {0: {'no_delete': 2}, 'other_data': 3}, 'keep_me': 4}, 'special': 4}}, 'important': 50}