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
关键改动说明
- 纯空格过滤:通过
value.strip() != ""判断,覆盖所有由空格组成的无效字符串 - 递归深层处理:对嵌套字典递归调用函数,实现全层级清理
- None值精准保留:单独判断
value is None,避免误删合法的None值 - 非字符串值兼容:默认保留数字、列表等非字符串类型的值(可按需调整)
示例验证
原始字典
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
相关产品推荐
相关产品推荐

