删除元组列表中包含 nan 的元组——Python
Posted
技术标签:
【中文标题】删除元组列表中包含 nan 的元组——Python【英文标题】:Remove a tuple containing nan in list of tuples -- Python 【发布时间】:2016-09-25 23:56:32 【问题描述】:我有一长串元组,并想使用 Python 删除其中包含 nan 的任何元组。
我目前拥有的: x = [('录制开始', 0), (nan, 4), (nan, 7), ..., ('事件标记1', 150)]
我正在寻找的结果: x = [('录制开始', 0), ('事件标记1', 150)]
我尝试使用 np.isnan 及其变体,但没有成功并不断收到错误消息:输入类型不支持 ufunc 'isnan',并且无法安全地将输入强制转换为任何受支持的根据转换规则“安全”的类型
任何建议将不胜感激!
【问题讨论】:
【参考方案1】:res = [n for n in x if not nan in n]
返回x
中没有对象nan
的所有对象。
【讨论】:
这不是测试nan
的安全方法:它只会检测到确切的nan
对象(即对象x
使得x is nan
为真)。
【参考方案2】:
使用列表推导:
x = [('Recording start', 0), (nan, 4), (nan, 7), ('Event marker 1', 150)]
new = [i for i in x if nan not in i]
【讨论】:
小心:仅当所有nan
s 都是精确 相同的Python 对象时才有效。试试float('nan') in (float('nan'), 2)
看看我的意思。【参考方案3】:
您可以使用列表推导来检查元组中的任何项目是否为 NaN。检查是通过首先检查类型然后使用math.isnan
来完成的,因为它不适用于其他类型:
import math
x = [('Recording start', 0), (float('nan'), 4), (float('nan'), 7), ('Event marker 1', 150)]
res = [t for t in x if not any(isinstance(n, float) and math.isnan(n) for n in t)]
print(res)
输出:
[('Recording start', 0), ('Event marker 1', 150)]
【讨论】:
【参考方案4】:至少在我对 nan 的 python 使用返回了“未定义的错误”,这就是我自己定义它的原因。 我认为您可以根据自己的需要使用 Python 过滤器功能。看例子:
nan = float('nan')
lst = [('Recording start', 0), (nan, 4), (nan, 7), ('Event marker 1', 150)]
y = filter( lambda x: nan not in x, lst)
print y
[('录制开始', 0), ('事件标记1', 150)]
【讨论】:
以上是关于删除元组列表中包含 nan 的元组——Python的主要内容,如果未能解决你的问题,请参考以下文章