2008-08-30 77 views

回答

384

基本答案:

mylist = ["b", "C", "A"] 
mylist.sort() 

這會修改你的原始列表(就地即排序)。要獲取列表的排序的副本,在不改變原有的,使用sorted()功能:

for x in sorted(mylist): 
    print x 

然而,上面的例子是有點幼稚,因爲他們沒有語言環境考慮,並執行的情況下,敏感排序。可以採取可選參數key的優點,以指定自定義排序順序(可替換地,使用cmp,是一個棄用解決方案,因爲它必須被多次評估 - key只計算每個元素一次)。

因此,根據當前的語言環境進行排序,以特定語言的規則考慮(cmp_to_key是functools一個輔助功能):

sorted(mylist, key=cmp_to_key(locale.strcoll)) 

最後,如果你需要,你可以指定一個custom locale排序:

import locale 
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # vary depending on your lang/locale 
assert sorted((u'Ab', u'ad', u'aa'), 
    key=cmp_to_key(locale.strcoll)) == [u'aa', u'Ab', u'ad'] 

最後要注意的:你會看到它使用lower()方法不區分大小寫排序的例子 - 那些是不正確的,因爲他們只工作了字符的ASCII子集。這兩個都是錯誤的,任何非英語數據:

# this is incorrect! 
mylist.sort(key=lambda x: x.lower()) 
# alternative notation, a bit faster, but still wrong 
mylist.sort(key=str.lower) 
+33

`mylist.sort(key = str.lower)`更快。 – jfs 2008-10-27 21:30:44

32
list.sort() 

它真的就是這麼簡單:)

+2

不適用於帶有數字的Python 3.6。改用`sorted(list)`。 – Dmitry 2017-10-28 21:01:40

10

但這是如何具體處理語言的排序規則?它是否考慮到區域設置?

不,list.sort()是一個通用的排序功能。如果您想根據統一的規則進行排序,你必須定義一個自定義排序鍵功能。你可以嘗試使用pyuca模塊,但我不知道它是怎麼完成。

41

還值得一提的sorted()功能:

for x in sorted(list): 
    print x 

這將返回一個列表的一個新的分類版本不改變原有名單。

18

爲字符串排序的正確方法是:

import locale 
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # vary depending on your lang/locale 
assert sorted((u'Ab', u'ad', u'aa'), cmp=locale.strcoll) == [u'aa', u'Ab', u'ad'] 

# Without using locale.strcoll you get: 
assert sorted((u'Ab', u'ad', u'aa')) == [u'Ab', u'aa', u'ad'] 

mylist.sort(key=lambda x: x.lower())前面的例子將正常工作爲ASCII唯一上下文。

1

假設s = "ZWzaAd"

排序上面的字符串的簡單的解決方案將是下面之一。

print ''.join(sorted(s)) 
4

請使用排序()函數在Python3

items = ["love", "like", "play", "cool", "my"] 
sorted(items2)