2013-08-05 23 views
1

我想在像Python排序花車(和楠值)的列表:每次我有點花車的列表(其中有NaN值),我得到一個不同的列表蟒蛇

print max(list) 
list.sort() 
list.reverse() 
for i in range(100): 
    print list[i] 
nan 
nan 
2.0803176458 
nan 
nan 
23.1620761136 
15.9680303803 
15.3134388394 
14.68055076 
11.450492644 
8.96268420227 
8.15331554187 
5.24420616524 
3.9665322752 
3.69758305442 
1.08500491226 
-0.227894225141 
-0.254784399765 
-0.866879940573 
-1.21267324819 
-2.21811678021 
nan 
nan 
2.69325878444 

當我運行它我獲得最大次數的不同值,並且我的列表在打印時沒有排序(結果在上面的代碼中)

有沒有人有任何見解,爲什麼會發生這種情況?

+0

閱讀[此線索](http://stackoverflow.com/questions/4240050/python-sort-function-breaks-in-所述-存在-的楠)。 –

回答

4
>>> float('nan') < 3.14 
False 
>>> float('nan') > 3.14 
False 
>>> float('nan') < float('nan') 
False 
>>> float('nan') > float('nan') 
False 
>>> float('nan') == float('nan') 
False 

的問題是,nan不具有相對於其他數字的順序。比較總是返回False,無論是對數字還是其他nan值。 sort()的合同要求列表項具有一致的順序才能正確排序。

要對nan進行排序,您需要覆蓋此行爲並定義您希望nan如何排序。例如,如果您希望它在所有其他數字之前出現,您可以使用key函數使nan等效於-inf

>>> l = [float('nan'), 3.14, -1, 0, float('nan')] 
>>> import math 
>>> sorted(l, key=lambda f: float('-inf') if math.isnan(f) else f) 
[nan, nan, -1, 0, 3.14] 
2

這是因爲nan不能與任何其他對象(甚至本身)進行比較。

>>> x = float('nan') 
>>> y = x 
>>> y == x 
False 

使用numpy處理nan的正確:

>>> import numpy as np 
>>> arr = np.array(nums) 
>>> np.sort(arr) 
array([ -2.21811678, -1.21267325, -0.86687994, -0.2547844 , 
     -0.22789423, 1.08500491, 2.08031765, 2.69325878, 
     3.69758305, 3.96653228, 5.24420617, 8.15331554, 
     8.9626842 , 11.45049264, 14.68055076, 15.31343884, 
     15.96803038, 23.16207611,   nan,   nan, 
       nan,   nan,   nan,   nan]) 
>>> np.nanmax(arr) 
23.162076113600001 
>>> np.nanmin(arr) 
-2.2181167802099999