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