2013-08-23 48 views
18

我有具有None的同類對象列表,但它可以包含任何類型的值。 例子:Python排序列表最後沒有

>>> l = [1, 3, 2, 5, 4, None, 7] 
>>> sorted(l) 
[None, 1, 2, 3, 4, 5, 7] 
>>> sorted(l, reverse=True) 
[7, 5, 4, 3, 2, 1, None] 

有沒有重新發明輪子,以獲取列表排序的常用的Python的方式方法,但沒有在列表的末尾值,這樣的:

[1, 2, 3, 4, 5, 7, None] 

我覺得這裏可以通過一些技巧與 「密鑰」 參數

+0

值是保證是'int's還是'None',或者你需要'None'來排序所有的任意對象嗎? – abarnert

+0

不,它可以是字符串或None,float和None。一般來說,它是與無元素同名的列表 –

+0

列表是否總是包含'none',它可以是'np.inf'還是'np.nan'? –

回答

52
>>> l = [1, 3, 2, 5, 4, None, 7] 
>>> sorted(l, key=lambda x: (x is None, x)) 
[1, 2, 3, 4, 5, 7, None] 

這構建了一個元組列表中的每個元素,如果值是None的元組是(True, None),如果該值是其他任何這將是(False, x)(其中x是值)。由於元組是逐項排序的,這意味着所有非None元素將首先(自False < True起),然後按值排序。

+1

我喜歡這個解決方案,因爲它適合於所有類型的同質litst –

+0

@NikolayGolub的:它甚至還支持異構的列表(只要你的異類類型都是可比擺在首位,當然)。 – abarnert

+1

如果在此解決方案中使用'reverse = True',請在鍵中使用'x不是None',否則將首先返回所有的None值。 – tutuDajuju

12

試試這個:

sorted(l, key=lambda x: float('inf') if x is None else x) 

由於無窮大比所有整數大,所以None將始終放在最後。

+0

哇!我不知道這個「inf」真棒! – 2013-08-23 20:56:24

+0

如果列表包含無限或列表是字符串列表,則這不起作用。 –

+0

@ NeilG是的,我們在這個問題本身的評論中提到了這一點。這個答案是針對最初發布的問題,但仍然適用於整數,所以我沒有刪除它。 – SethMMorton