删除元组列表中包含 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]

【讨论】:

小心:仅当所有nans 都是精确 相同的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的主要内容,如果未能解决你的问题,请参考以下文章

如何从python中的列表中删除重复的元组?

使用python从不同长度的元组列表中删除重复项

python的元组和列表的区别

Python中的元组(Tuple)

如何删除一些额外的元组和列表并在python中的字符串之间打印一些额外的东西?

python学习之第五篇:Python中的元组及其所具有的方法