2015-10-12 33 views
1

混合名單說我有這個名單l = ['the fountainhead','atlas shrugged', 1, 67, 12, 0]我要進行排序,以便最終的結果是['atlas shrugged', 'the fountainhead', 0, 1, 12, 67]。這意味着列表中的字符串和整數應按升序排序。如果我使用sorted()數字出現第一:排序在Python

>>> sorted(l) 
[0, 1, 12, 67, 'atlas shrugged', 'the fountainhead'] 

,如果我用的λ,它不能讓過去的訂貨清單,因爲它包含了不同類型的無與倫比的元素:

>>> sorted(l, key=lambda x:int(x)) 

Traceback (most recent call last): 
    File "<pyshell#13>", line 1, in <module> 
    sorted(l, key=lambda x:int(x)) 
    File "<pyshell#13>", line 1, in <lambda> 
    sorted(l, key=lambda x:int(x)) 
ValueError: invalid literal for int() with base 10: 'the fountainhead' 

據我所知,使用lambdas時沒有辦法利用異常處理。這只是一個簡單的例子來說明這個問題。我想知道是否有一種靈活的通用方法來對Python中的混合列表進行排序。我在SO上搜索了相關頁面,但找不到一個通用的方法。

+1

好了,檢查對象的類型。如果它是一個數字類型,那麼使用該項目,否則使用'float(' - inf')'。三元表達式可以用於此。 –

+0

你的排序規則是什麼?所有的字符串是否應該在數字前出現或者只是以「a」開頭的字符串? –

+0

@GregHewgill字符串需要先出現。 – Omid

回答

3

我認爲這裏的第一個問題是,你有一個混合列表 - 一般情況下,它變得棘手遵循代碼時,你不知道你可以做什麼操作上的哪一個元素,因爲他們是不是所有的相同的類型。

沒有通用的解決方案(因爲有知道如何比較不同類型的對象沒有一般方式),但你絕對可以處理你的情況下(如果你必須)...

import numbers 
sorted(l, key=lambda x: (isinstance(x, numbers.Number), x)) 

應該做的伎倆。基本上,我的關鍵功能返回tuple。由於tuple(和所有蟒序列)按字典順序排序,蟒將首先看所述元組的第一個元素 - 在這種情況下,這將是False0)如果該項目不是一個號碼,以便那些元件將首先出現。

演示:

>>> l = [1, 2, 3, 'foo', 'bar', 4, 8, -10, 'baz'] 
>>> import numbers 
>>> sorted(l, key=lambda x: (isinstance(x, numbers.Number), x)) 
['bar', 'baz', 'foo', -10, 1, 2, 3, 4, 8] 
+0

這不能排序字符串。 – Omid

+0

@Omid - 你確定嗎?它似乎應該與字符串一起工作... – mgilson

+0

是的。我正在運行Python 2.7,所以可能是這樣的原因: '>>> sorted(l,key = lambda x:(isinstance(x,numbers.Number),x)) ['The Fountainhead','阿特拉斯聳了聳肩,0,1,12,67]' – Omid