如何删除深度嵌套字典中所选键所在的键:值对



关于

这个问题是关于删除键的最基本问题:在找到的键处的值对,在整个字典上迭代。

其他问题

  • 删除键:值对的频率应该比在用其值替换键:值配对的特殊问题高得多。在深度嵌套的字典中,如果所选键出现,我如何用其值来替换键:价值配对。说这两个问题足够不同一开始听起来可能不太可信,因为措辞似乎几乎相同,但随后,请检查代码解决方案并进行测试。花了一个小时才找到答案是有原因的。

  • 2011年的问题在迭代Python dict的同时修改它(85k视图)似乎甚至没有找到一个有效的答案,尽管无可否认,它也已经过时了。


之前:

我有一本嵌套了很多次的字典。

{
"key0": {
"key1a": {
"sub_key2a": "sub_value2a",
"sub_key2b": "sub_value2b"
},
"key1b": {
"key_XYZ": {
"sub_key2a": "sub_value2a",
"sub_key2b": "sub_value2b"
}
}
}
}

之后:

结果应该是这样的,删除所有具有值的"sub_key2a"密钥:

{
"key0": {
"key1a": {
"sub_key2b": "sub_value2b"
},
"key1b": {
"key_XYZ": {
"sub_key2b": "sub_value2b"
}
}
}
}

在迭代Python dict的同时修改它

当我循环浏览字典中要删除的项目时,我得到了错误

RuntimeError: dictionary changed size during iteration

这需要以某种方式避免。

每当关键字"sub_key2a"出现在字典中的某个位置时,如何删除"sub_key2a": SOME_VALUE关键字-值对?

技巧

诀窍是在递归到达子级之前,提前查明target_key是否在下一个子级中(=this_dict[key]=当前dict迭代的值)。只有这样,在遍历字典时,您仍然可以删除子级别的键:值对。一旦你达到了与要删除的密钥相同的级别,然后尝试从那里删除它,你就会得到错误:

RuntimeError: dictionary changed size during iteration

代码

因此,代码看起来如下:

import copy
def find_remove(this_dict, target_key, bln_overwrite_dict=False):
if not bln_overwrite_dict:
this_dict = copy.deepcopy(this_dict)
for key in this_dict:
# if the current value is a dict, dive into it
if isinstance(this_dict[key], dict):
if target_key in this_dict[key]:
this_dict[key].pop(target_key)
this_dict[key] = find_remove(this_dict[key], target_key)
return this_dict
dict_nested_new = find_remove(nested_dict, "sub_key2a")

学分

这几乎是衍生产品的副本在深度嵌套的字典中,无论所选键出现在哪里,我如何用其值替换键:值对。但我花了一段时间才改变这个答案,这样它就会删除一个键:value by its key。这就是我分享这篇文章的原因,请注意95%的学分都指向了链接!

";衍生答案";在通过检查if target_key in this_dict[key]:进入下一个递归级别之前,在中搜索target_key


旁注:格式化输出

如果您想很好地打印或保存字典,请参阅如何将JSON数据写入文件?。

delete a["key_"]["key0a"]["sub_key2a"]

最新更新