Python中如何从字典列表删除值为nan/null/空的键值对
问题原因分析
- 空值判断逻辑错误:Python中的nan是float类型的特殊值,不是字符串
'nan',且nan不与任何值相等(包括自身),无法通过== 'nan'或is 'nan'判断,必须使用math.isnan()或者pandas.isna()这类专用方法判断。 - 遍历层级错误:需要删除的空值存放在
address字段对应的列表内层的子字典中,第一种方法直接遍历最外层字典,触达不到需要清理的子字典层级。 - 变量使用错误:第二种代码中
address_dic[address]的address是未定义的变量,正确写法应该是address_dic['address'],取key为字符串'address'的取值。 - 迭代风险:如果直接遍历原字典的
items()同时执行删除操作,会触发迭代器异常,需要先把items转成列表再遍历,或者生成新的过滤后的字典。
正确实现代码
如果仅需要处理nan、None、空字符串场景,可以用原生math模块实现:
import math # 遍历address列表下的每个地址子字典 for addr_item in address_dic['address']: # 先将items转成列表再遍历,避免修改原字典触发迭代异常 for key, value in list(addr_item.items()): # 同时判断nan、None、空字符串三类无效值 if (isinstance(value, float) and math.isnan(value)) or value is None or value == '': del addr_item[key]
如果你的项目已经引入pandas,可以用pd.isna()兼容更多空值类型(包括nan、None、NaT等),代码更简洁:
import pandas as pd for addr_item in address_dic['address']: for key, value in list(addr_item.items()): if pd.isna(value) or value == '': del addr_item[key]
运行以上代码后即可得到你期望的输出结果。
内容的提问来源于stack exchange,提问作者Naveen
相关产品推荐
相关产品推荐

