You need to enable JavaScript to run this app. Python如何将字符串类型列表转为列表并删除其中的nan元素
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 16:54:04