【python】sort和sorted
阿新 • • 發佈:2018-12-05
語法:
list.sort(func=None, key=None, reverse=False)
cmp -- 可選引數, 如果指定了該引數會使用該引數的方法進行排序;
key -- 用來在進行比較之前指定每個列表元素上要呼叫的函式,指定可迭代物件中的一個元素來進行排序;
reverse -- 排序規則,reverse = True 降序, reverse = False 升序(預設);
sorted(iterable, key=None, reverse=False)
iterable -- 可迭代物件;
sort 和sorted 的區別:
- sorted()不會改變原來的list,返回一個新的已經排好序的list,而sort()返回值為None;
- list.sort()方法僅僅被list所定義,sorted()可用於任何一個可迭代物件;
#區分大小寫的字串比較排序 >>> sorted("This is a test string from Andrew".split(), key=str.lower) ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
>>> student_tuples = [
('john', 'A', 15),
('jane', 'B', 12),
('dave', 'B', 10),
]
>>> sorted(student_tuples, key=lambda student:student[2]) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
#先排序列表list中元素的第一個關鍵字,然後在第一個元素的基礎上排序按第二個關鍵字進行排序: >>> list = [('d',3),('a',5),('d',1),('c',2),('d',2)] >>> print sorted(list, key = lambda x:(x[0],x[1])) [('a', 5), ('c', 2), ('d', 1), ('d', 2), ('d', 3)]
Operator Module Functions
這個操作模組有:
operator.itemgetter() ----- 通過下標
operator.attrgetter() ----- 通過引數
operator.methodcaller() ----- python 2.5 被引入,下文詳細介紹
使用這幾個函式,對於上面 Key Function 的例子處理起來將會更加的簡便和快速.
先一起介紹 operator.itemgetter() 和 operator.attrgetter() ,會更加容易理解:
>>> from operator import itemgetter, attrgetter
>>> sorted(student_tuples, key=itemgetter(2))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>> sorted(student_objects, key=attrgetter('age'))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)
這個操作模組也允許多層次的進行排序,例如可以先排序 “成績grand” 再排序 “年齡age”
>>> sorted(student_tuples, key=itemgetter(1,2))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
>>> sorted(student_objects, key=attrgetter('grade', 'age'))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
>>> list = [('d',3),('a',5),('d',1),('c',2),('d',2)]
>>> from operator import itemgetter
>>> sorted(list, key=itemgetter(0,1))
[('a', 5), ('c', 2), ('d', 1), ('d', 2), ('d', 3)]
但是還是推薦key function 中的方法,因為為了這一個排序而引入一個庫檔案,相對來說得不償失。
operator.methodcaller() 函式:
這個函式是對某個物件的使用固定引數進行排序,例如:str.count() 函式可以計算每個字串物件中含有某個引數的個數,那運用這個函式我就可以通過 str.count() 計算出某個字元的個數從而來確定排序的優先順序:
>>> from operator import methodcaller
>>> messages = ['critical!!!', 'hurry!', 'standby', 'immediate!!']
>>> sorted(messages, key=methodcaller('count', '!'))
['standby', 'hurry!', 'immediate!!', 'critical!!!']
根據字串中的數字排序,如f10應該在f2後面
#encoding=utf-8
print '中國'
#根據字串中的數字排序,如f10應該在f2後面
import re
re_digits = re.compile(r'(\d+)')
def emb_numbers(s):
pieces=re_digits.split(s)
pieces[1::2]=map(int,pieces[1::2])
return pieces
def sort_strings_with_emb_numbers(alist):
aux = [(emb_numbers(s),s) for s in alist] #[(['file',1,'.txt'],'file1.txt')]
aux.sort()
return [s for __,s in aux] #提取元組中第二個元素,比如'file1.txt'
def sort_strings_with_emb_numbers2(alist):
return sorted(alist, key=emb_numbers)
filelist='file10.txt file2.txt file1.txt'.split()
print filelist
print '--DSU排序'
print sort_strings_with_emb_numbers(filelist)
print '--內建DSU排序'
print sort_strings_with_emb_numbers2(filelist)
中國
['file10.txt', 'file2.txt', 'file1.txt']
--DSU排序
['file1.txt', 'file2.txt', 'file10.txt']
--內建DSU排序
['file1.txt', 'file2.txt', 'file10.txt']