从Python嵌套字典中提取子字典空值项并跳过无空值的顶级键
解决方案
核心逻辑:在外层字典推导式中增加判断,仅当内层过滤得到的子字典非空时,才保留对应的顶级键项,同时修正原代码中覆盖内置dict的坏实践。
修正步骤
- 替换原变量名(避免覆盖内置
dict类型,否则后续使用内置dict构造函数时会报错):nested_dict = {'a': {'name': 'Sam', 'likes': 'Cookies'}, 'b': {'name': 'Margaret', 'likes': None}, 'c': {'name': None, 'likes': None}} - 增加外层过滤条件,根据运行环境选择对应写法:
写法1:Python 3.8+ 推荐(使用海象运算符,简洁高效)
运行输出:result = { top_key: filtered_sub for top_key, sub in nested_dict.items() # 海象运算符直接计算过滤后的子字典,非空则保留该顶级键项 if (filtered_sub := {k: v for k, v in sub.items() if not v}) }{'b': {'likes': None}, 'c': {'name': None, 'likes': None}}写法2:兼容旧Python版本(无需海象运算符)
支持Python3.7及更早版本,通过内层遍历单元素列表临时存储过滤后的子字典,避免重复计算:
输出与上述写法完全一致。result = { top_key: filtered_sub for top_key, sub in nested_dict.items() for filtered_sub in [{k: v for k, v in sub.items() if not v}] if filtered_sub }
原问题根因
原推导式外层无任何过滤条件,哪怕内层遍历子字典后没有符合条件(值为空)的键值对、生成的子字典为空,也会将对应的顶级键项(如'a': {})加入最终结果,增加外层非空判断即可跳过这类空项。
内容的提问来源于stack exchange,提问作者user3674993
相关产品推荐
相关产品推荐

