我有一个使用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}}}}}}}}
{}
答案 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}