2016-05-10 71 views
7

是否可以轻松删除Python集合对象的NaN值?鉴于NaN值不等于任何值(并且float('nan') is float('nan')也是False),您可以在Set中结束许多NaN值。从集合中删除NaN值

>>> a = set((float('nan'), float('nan'), 'a')) 
>>> a 
{nan, nan, 'a'} 

我可以拿出它来定义像math.isnan功能最好的,但毕竟是宽容的非浮动类型,如:

def my_isnan(x): 
    try: 
     return math.isnan(x) 
    except TypeError: 
     return False 

然后你就可以使用一组类似的理解这样的:

>>> {x for x in a if not my_isnan(x)} 
{'a'} 
+0

把NaN的一组中的第一个地方是一个坏主意。他们违背了一套建立在这个基础上的假设。 – user2357112

+0

这是什么问题? –

+0

@ValentinLorentz也许以问号结尾的句子? –

回答

5

在实践中,你可以看看以下事实nan != nan为特征,而不是一个错误:

>>> a = {float('nan'), float('nan'), 'a'} 
>>> a 
{nan, nan, 'a'} 
>>> {x for x in a if x==x} 
{'a'} 

从积极的方面来看,不需要辅助函数。不利的一面是,如果你有一个非nan对象,它也不等于它自己,你也会删除它。你

+0

我知道必须采取某种方式来诉诸帮手功能。谢谢! –

1

也可以使用filter

In[75]: a = set((float('nan'), float('nan'), 'a')) 

In[76]: set(filter(lambda x: x == x , a)) 
Out[76]: {'a'}