如何删除深度嵌套词典中出现所选键的位置的键:值对? [英] How can I remove a key:value pair wherever the chosen key occurs in a deeply nested dictionary?
问题描述
关于
此问题是关于删除键的最基本问题:找到键的值对,遍历整个词典。
其他问题
删除key:Value对应该比用How can I replace a key:value pair by its value whereever the chosen key occurs in a deeply nested dictionary?处的值替换key:Value对的特殊问题发生得更频繁。说这两个问题有很大的不同,起初听起来可能不太可信,因为措辞似乎几乎相同,但接下来,请检查代码解决方案并进行测试。花了几个小时才弄清楚是有原因的。
2011年的问题Modifying a Python dict while iterating over it(85000次查看)似乎甚至没有找到有效的答案,尽管它也是过时的。
之前:
我有一个多次嵌套的词典。
{
"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词典
当我遍历要删除的词典条目时,出现错误
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")
制作者名单
这几乎是衍生产品How can I replace a key:value pair by its value wherever the chosen key occurs in a deeply nested dictionary?的副本。但我花了一段时间才改变了答案,这样它就会删除一个键:按键取值。这就是我分享这篇文章的原因,请注意,95%的点数都流向了链接!
衍生答案的主要附加价值在于,您可以在进入下一个递归级别之前通过选中if target_key in this_dict[key]:
在值中搜索target_key
。
旁注:格式化输出
如果要打印或保存词典,请参阅How do I write JSON data to a file?。
这篇关于如何删除深度嵌套词典中出现所选键的位置的键:值对?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!