2016-05-10 106 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'}