Python3:根据字符串路径删除嵌套JSON中的指定键
如何根据可变长度路径删除嵌套字典中的指定键?
需求场景
需要根据传入脚本的可变长度字符串路径,在嵌套JSON(字典)中使用pop()方法删除指定键,且需支持任意层级的键路径。
问题示例
给定字典{'IP': {'key1': 'val1', 'key2': 'val2'}},当传入路径字符串IP.key1时,需要删除其中的key1键。
目前找到一段能定位目标键但无法实现删除的递归代码:
data = {'IP': {'key1': 'val1', 'key2': 'val2'}} lst = ['IP', 'key1'] # 将键字符串转换为数组 def get(d,l): if len(l)==1: return d[l[0]] return get(d[l[0]],l[1:]) print(get(data, lst))
由于环境受限,无法使用小众库,希望基于这段代码修改实现删除功能,但对递归逻辑感到困惑。
可行解决方案
基于Filip Müller的方案,已实现支持任意层级的删除功能,以下是复杂数据集的验证示例:
data = {'IP': {'key1': {'key3': {'key4': 'val4', 'key5': 'val5'}}, 'key2': 'val2'}} lst = ['IP', 'key1', 'key3', 'key4'] def popKey(d, l): current_level = d # 遍历到目标键的父层级字典 for key in l[:-1]: current_level = current_level[key] # 在父层级上执行pop删除目标键 current_level.pop(l[-1]) return d print(popKey(data, lst))
方案说明
- 先将路径字符串分割为键列表(例如
IP.key1分割为['IP', 'key1']) - 通过循环遍历到目标键的父层级字典,而非直接定位目标值
- 最后在父层级上调用
pop()方法,这样就能直接修改原嵌套字典的结构
原代码无法删除的原因
原递归函数get()仅返回目标键对应的值,没有保留对父层级字典的引用,因此无法通过它执行删除操作。而上述方案通过跟踪父层级,解决了这个核心问题。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

