如何基于指定保留键从已有嵌套字典创建Python目标嵌套字典
解决方案
一、保留键列表的正确写法
用嵌套字典对应原字典的层级结构即可,每个层级的键对应下一级要保留的键列表(或嵌套字典),举两个直观例子:
- 两层结构的保留规则:
{"user": ["name", "age"], "settings": ["theme", "notifications"]} - 三层结构的保留规则:
{"user": {"profile": ["name", "avatar"], "stats": ["posts", "likes"]}}
这种结构能精准匹配原字典的嵌套层级,明确告诉程序每个层级该留存哪些键。
二、最优实现:递归筛选
因为是嵌套字典,写个递归函数最高效——只遍历需要保留的键路径,完全不用处理那4000个要删除的键,代码如下:
def filter_nested_dict(original_dict, keep_spec): filtered = {} for key, value in original_dict.items(): if key in keep_spec: # 下一级是字典,且保留规则对应也是字典,继续递归筛选 if isinstance(value, dict) and isinstance(keep_spec[key], dict): filtered[key] = filter_nested_dict(value, keep_spec[key]) # 下一级是字典,保留规则是要留存的子键列表 elif isinstance(value, dict) and isinstance(keep_spec[key], list): filtered[key] = {k: v for k, v in value.items() if k in keep_spec[key]} # 非字典类型直接保留原始值 else: filtered[key] = value return filtered
实际用例演示
假设你从JSON加载的原始数据是这样:
original_data = { "user": { "name": "Alice", "age": 28, "email": "alice@example.com", "profile": { "bio": "Hello world", "avatar": "avatar.jpg", "location": "NY" } }, "settings": { "theme": "dark", "notifications": True, "language": "en" }, "logs": ["login1", "login2"] }
你的保留规则可以这么定义:
keep_keys = { "user": { "name": None, # 标记直接保留该键的原始值 "profile": ["avatar"] }, "settings": ["theme", "notifications"] }
然后完成加载、筛选、保存的完整流程:
import json # 读取原始JSON文件 with open("your_raw_data.json", "r") as f: original_data = json.load(f) # 生成筛选后的嵌套字典 filtered_data = filter_nested_dict(original_data, keep_keys) # 将结果写入新的JSON文件 with open("filtered_result.json", "w") as f: json.dump(filtered_data, f, indent=4)
运行后得到的结果就是仅包含你指定键的嵌套字典,完全符合需求。
额外提示
- 如果原字典里有包含字典的列表(比如
"posts": [{"id":1, "title":"xxx"}, ...]),可以在递归函数里加个判断,遍历列表中的每个字典再调用筛选函数,按需调整即可。 - 保留规则里,非嵌套的键用
None或者任意非字典/列表的值标记都可以,函数会直接保留对应值。
内容的提问来源于stack exchange,提问作者defnoteg
相关产品推荐
相关产品推荐

