Python: sorted,operator.itemgetter的用法

[Python]對(duì)容器內(nèi)數(shù)據(jù)的排序有兩種,一種是容器自己的sort函數(shù),一種是內(nèi)建的sorted函數(shù)。
sort函數(shù)和sorted函數(shù)唯一的不同是,sort是在容器內(nèi)排序,sorted生成一個(gè)新的排好序的容器。

對(duì)于一個(gè)簡(jiǎn)單的數(shù)組 L=[5,2,3,1,4].
sort: L.sort()

sorted(...)
sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
iterable:待排序的可迭代類型的容器;
cmp:用于比較的函數(shù),比較什么由key決定,有默認(rèn)值,迭代集合中的一項(xiàng);
key:用列表元素的某個(gè)已命名的屬性或函數(shù)(只有一個(gè)參數(shù)并且返回一個(gè)用于排序的值)作為關(guān)鍵字,有默認(rèn)值,迭代集合中的一項(xiàng);
reverse:排序規(guī)則. reverse = True 或者 reverse = False,有默認(rèn)值。
返回值:是一個(gè)經(jīng)過(guò)排序的可迭代類型,與iterable一樣。

如果是一個(gè)多維的列表 L=[(‘b’,2),(‘a(chǎn)’,1),(‘c’,3),(‘d’,4)].
有三種選擇對(duì)這個(gè)多維列表進(jìn)行排序
利用cmp函數(shù)

sorted(L, cmp=lambda x,y:cmp(x[1],y[1]))
L.sort(cmp=lambda x,y:cmp(x[1],y[1]))

利用key

sorted(L, key=lambda x:x[1]);
L.sort(key=lambda x:x[1]);

反序

以上幾種排序均可加上參數(shù)reverse.
例如 sorted(reverse=True), L.sort(reverse=True). 或者改成False

OrderedDict是collections中的一個(gè)包,能夠記錄字典元素插入的順序,常常和排序函數(shù)一起使用來(lái)生成一個(gè)排序的字典。
比如,比如一個(gè)無(wú)序的字典
d = {‘banana’:3,’apple’:4,’pear’:1,’orange’:2}
通過(guò)排序來(lái)生成一個(gè)有序的字典,有以下幾種方式
collections.OrderedDict(sorted(d.items(),key = lambda t:t[0]))
或者
collections.OrderedDict(sorted(d.items(),key = lambda t:t[1]))
或者
collections.OrderedDict(sorted(d.items(),key = lambda t:len(t[0])))

operator.itemgetter函數(shù)
operator模塊提供的itemgetter函數(shù)用于獲取對(duì)象的哪些維的數(shù)據(jù),參數(shù)為一些序號(hào)(即需要獲取的數(shù)據(jù)在對(duì)象中的序號(hào)),下面看例子。

a = [1,2,3] 
b=operator.itemgetter(1)      //定義函數(shù)b,獲取對(duì)象的第1個(gè)域的值> b(a) 
2 
b=operator.itemgetter(1,0)   //定義函數(shù)b,獲取對(duì)象的第1個(gè)域和第0個(gè)的值
b(a) 
(2, 1) 

要注意,operator.itemgetter函數(shù)獲取的不是值,而是定義了一個(gè)函數(shù),通過(guò)該函數(shù)作用到對(duì)象上才能獲取值。

  • 用 operator 函數(shù)進(jìn)行多級(jí)排序
 students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10),]  
>>> sorted(students, key=itemgetter(1,2))  # sort by grade then by age  
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]  
## 對(duì)字典排序
>>> d = {'data1':3, 'data2':1, 'data3':2, 'data4':4}  
>>> sorted(d.iteritems(), key=itemgetter(1), reverse=True)  
[('data4', 4), ('data1', 3), ('data3', 2), ('data2', 1)]  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 文:鄭元春一個(gè)有著美好夢(mèng)想的coder! 人生苦短,我用Python。 P.S. 個(gè)人認(rèn)為,查找和排序是算法的核心...
    北靜王閱讀 2,229評(píng)論 3 10
  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫(xiě)完項(xiàng)目接著寫(xiě)寫(xiě)一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,787評(píng)論 1 118
  • Python要對(duì)list迭代序列的排序,提供了兩種方法: list的成員函數(shù)sort()排序 內(nèi)建函數(shù)sorted...
    翎月閱讀 1,603評(píng)論 0 5
  • 教程總綱:http://www.runoob.com/python/python-tutorial.html 進(jìn)階...
    健康哥哥閱讀 2,177評(píng)論 1 3
  • 個(gè)人筆記,方便自己查閱使用 Py.LangSpec.Contents Refs Built-in Closure ...
    freenik閱讀 67,937評(píng)論 0 5

友情鏈接更多精彩內(nèi)容