2016-05-10 16 views
7

Czy można łatwo usunąć wartości NaN dla obiektu zestawu Python? Biorąc pod uwagę, że wartości NaN nie są równe (i float('nan') is float('nan') jest również False), możesz otrzymać wiele wartości NaN w zestawie.Usuń wartość NaN z zestawu

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

Najlepszym mogę wymyślić to, aby zdefiniować funkcję jak math.isnan, ale że jest tolerancyjny rodzajów non obrocie jak:

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

Następnie można użyć zestawu zrozumieniem jak to:

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

Umieszczenie Nans w zestawie w pierwszej kolejności jest to zły pomysł. Naruszają założenia, na których zbudowany jest zestaw. – user2357112

+0

Jakie jest pytanie? –

+0

@ValentinLorentz Może zdanie, które kończy się znakiem zapytania? –

Odpowiedz

5

W praktyce, można spojrzeć na fakt, że nan != nan jako cecha, a nie błąd:

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

Po stronie pozytywów, nie ma potrzeby funkcji pomocnika. Po stronie negatywnej, jeśli masz obiekt inny niż nan, który również nie jest równy sobie, usuniesz go również.

+0

Wiedziałem, że musi istnieć jakiś sposób na wykorzystanie funkcji pomocnika. Dzięki! –

1

Również można użyć filter:

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

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