2013-05-16 145 views
6

我試圖按字母順序排列列表,其中大寫字母應該在小寫字母之前出現。python:如何根據大寫字母按字母順序排序列表

l = ['a', 'b', 'B', 'A'] 

sorted(l)應導致['A','a','B','b']

我已經試過這兩種形式,但都無濟於事;

>>> sorted(l, key=lambda s: s.lower()) 
['a', 'A', 'b', 'B'] 
>>> sorted(l, key=str.lower) 
['a', 'A', 'b', 'B'] 

回答

9

創建一個元組作爲密鑰,而不是:

>>> sorted(lst, key=lambda L: (L.lower(), L)) 
['A', 'a', 'B', 'b'] 

這意味着較低的情況下,排序順序不會改變('a', 'a')但手段大寫第一個鍵把它水平較低 - 案例等同,那麼排序前:如('a', 'A') < ('a', 'a')

+0

完美解決方案提出了更復雜的解決方案。對不起我的新空房禁地之前的評論:) –

+0

如果你有非英文字符串,必須非常小心的是依賴於使用'.lower()方法'不區分大小寫的排序,它們只能用於字符的ASCII子集。正確的方法涉及到一些地區設置的擺弄。 – wim

+0

例如,這種解決方案並不用於'LST = [ 'A', 'B', 'B', 'A']'工作有關python 2(可能就會對python3) – wim

3

有趣的這樣的列表應該如何排序以下列表

lst = ['abb', 'ABB', 'aBa', 'AbA'] 

提出的解決方案產生以下結果

>>> sorted(lst, key=lambda L: (L.lower(), L)) 
['AbA', 'aBa', 'ABB', 'abb'] 

我可以用不同的結果

>>> sorted(lst, key=lambda a: sum(([a[:i].lower(), 
            a[:i]] for i in range(1, len(a)+1)),[])) 
['ABB', 'AbA', 'aBa', 'abb'] 
+0

好主意,但表達可能會更簡單 - 如何[ord x)+ 31.5 * x.isupper()for x in a]'? – georg