【发布时间】:2020-04-01 20:19:52
【问题描述】:
如果已经有回答此问题的问题,但我没有找到任何帮助,我提前道歉。本质上,我有一个具有 n 级的嵌套字典,即,
nested_dict = {
"lvl_1a": {
"lvl_2a_1": {
"lvl_3a_1": 1,
"lvl_3b_1": 2,
...,
},
"lvl_2b_1": {
"lvl_3a_2": 5,
"lvl_3b_2": 6,
...,
},
"lvl_1b": {
"lvl_2a_2": {
"lvl_3a_3": 1,
"lvl_3b_3": 2,
...,
}
}
}
还有一个我想删除的键,比如“lvl_3a_3”。这就是我目前所拥有的
def remove_a_key(d, remove_key):
if isinstance(d, dict) and d:
for key in list(d.keys()):
if key == remove_key:
del d[key]
return d
elif not d[key]:
del d[key]
return remove_a_key(d, remove_key)
else:
return remove_a_key(d[key], remove_key)
modified_dictionary = remove_a_key(nested_dictionary, "lvl_3a_3")
在另一个人的帮助下
StackOverflow question。
但是一旦找到要删除的key,并且预期return d,它就会继续else-statement,而不是完全退出函数。事实上,它在完全退出之前运行了两次else-语句。我不确定发生了什么,除了我以某种方式引用了该函数,因此它没有正确返回。
【问题讨论】:
-
请重复介绍,尤其是MRE。您发布的代码仅定义了一个函数并退出而不执行。
-
请记住,
return返回 one 级别。外部堆栈帧获取执行;如果该层不选择返回,则预期执行其他代码。尽管在给定的代码中,remove_a_key确实 的每个实例都会立即返回,但我真的很想看到一个真正的复制者,以便相信问题中给出的问题描述是准确的一个,而不是对所呈现的症状的误读。 -
也就是说,我不知道您希望这个函数如何做任何有用的事情。如果您在列表的第一次迭代期间总是
return(因此,当key仅指 very first 键时),您如何期望该列表的其他成员(或者,在这个上下文,该字典中的其他键)要处理? -
我也不知道你为什么要在你做成功删除后递归,在同样的情况下,删除后递归总是重新创建。这似乎是一条通往无限循环的捷径。
标签: python python-3.x dictionary recursion nested