You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于指定保留键从已有嵌套字典创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 14:02:27