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

Python嵌套字典清理:保留None,移除空字符串及纯空格值

解决嵌套字典中空字符串/纯空格值的移除问题

需求回顾

需要处理嵌套字典,规则如下:

  • 保留值为None的键值对
  • 删除值为空字符串""的键值对
  • 删除值为任意数量空格(如" "、" ")的键值对
  • 递归处理所有层级的嵌套字典

问题分析

原delete_junk函数失效的核心原因:仅判断了值是否为空字符串,未处理纯空格字符串的情况,且可能递归逻辑未覆盖所有嵌套场景。

完善后的函数实现

def delete_junk(data):
    if isinstance(data, dict):
        cleaned = {}
        for key, value in data.items():
            # 递归处理嵌套字典
            if isinstance(value, dict):
                cleaned_value = delete_junk(value)
                # 嵌套字典处理后非空/非None则保留
                if cleaned_value or cleaned_value is None:
                    cleaned[key] = cleaned_value
            else:
                # 明确保留None值
                if value is None:
                    cleaned[key] = value
                # 保留非字符串类型,或非空/非纯空格的字符串
                elif not isinstance(value, str) or (value.strip() != ""):
                    cleaned[key] = value
        return cleaned
    return data

关键改动说明

  1. 纯空格过滤:通过value.strip() != ""判断,覆盖所有由空格组成的无效字符串
  2. 递归深层处理:对嵌套字典递归调用函数,实现全层级清理
  3. None值精准保留:单独判断value is None,避免误删合法的None值
  4. 非字符串值兼容:默认保留数字、列表等非字符串类型的值(可按需调整)

示例验证

原始字典

original_dict = {
    "name": "",
    "age": None,
    "address": {
        "street": "   ",
        "city": "New York",
        "zipcode": ""
    },
    "phone": "  123456  ",
    "notes": None
}

处理后预期结果

expected_dict = {
    "age": None,
    "address": {
        "city": "New York"
    },
    "phone": "  123456  ",
    "notes": None
}

调用验证

cleaned_dict = delete_junk(original_dict)
print(cleaned_dict == expected_dict)  # 输出: True

可选扩展

如果需要同时去除字符串前后空格(而非仅删除纯空格),可修改字符串处理逻辑:

elif isinstance(value, str):
    stripped_val = value.strip()
    if stripped_val != "":
        cleaned[key] = stripped_val
else:
    cleaned[key] = value

内容的提问来源于stack exchange,提问作者aero8991

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 02:43:17