Python如何将字符串类型列表转为列表并删除其中的nan元素
报错核心原因
执行eval(x)时,字符串内容里的nan会被解析器识别为待查找的Python变量名,而默认运行环境中并没有定义名为nan的全局变量,因此直接抛出NameError。同时原代码里用str(k)!='nan'做过滤的逻辑也比较脆弱,容易出现误判。
可行实现方案
方案1:带命名空间约束的eval解析
在调用eval时传入预定义的全局命名空间,把nan映射到Python内置的浮点无效值math.nan,既不用修改全局环境的变量定义,也能顺利完成解析,同时换用更精准的nan判断逻辑做过滤:
import math x = '[1.4,2.3,nan]' # 第二个参数为eval可访问的全局命名空间,提前映射nan的对应值 x = eval(x, {"nan": math.nan}) # 用math.isnan精准判断无效浮点数,避免字符串转换的判断误差 x = [item for item in x if not (isinstance(item, float) and math.isnan(item))] # 最终输出 [1.4, 2.3]
注意:如果待解析的字符串内容来源不可信,不建议使用eval,因为存在执行任意恶意代码的风险。
方案2:预处理字符串后用json模块解析(更安全)
待处理的字符串本质是类列表结构,只是夹带了不符合JSON规范的nan标识,只需要做简单的文本替换把nan改成JSON支持的null值,就可以用内置的json模块完成结构解析,全程没有任意代码执行的风险:
import json x = '[1.4,2.3,nan]' # 把字符串里的nan替换为JSON可识别的null占位 processed_x = x.replace('nan', 'null') # 解析为原生Python列表 x = json.loads(processed_x) # 过滤掉替换后解析得到的None空值 x = [item for item in x if item is not None] # 最终输出 [1.4, 2.3]
这个方案不需要依赖eval的代码执行能力,对于格式规整的类列表字符串,解析效率和可靠性都更高。
两个方案的适用区别
- 方案1适合字符串内容完全可控、无需考虑安全风险的快速开发场景
- 方案2的解析过程没有代码执行风险,对不可信来源的字符串兼容性更好,生产环境更推荐
内容的提问来源于stack exchange,提问作者Mainland
相关产品推荐
相关产品推荐

