Python: sorted,operator.itemgetter的用法

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

對于一個簡單的數(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決定,有默認值,迭代集合中的一項;
key:用列表元素的某個已命名的屬性或函數(shù)(只有一個參數(shù)并且返回一個用于排序的值)作為關(guān)鍵字,有默認值,迭代集合中的一項;
reverse:排序規(guī)則. reverse = True 或者 reverse = False,有默認值。
返回值:是一個經(jīng)過排序的可迭代類型,與iterable一樣。

如果是一個多維的列表 L=[(‘b’,2),(‘a(chǎn)’,1),(‘c’,3),(‘d’,4)].
有三種選擇對這個多維列表進行排序
利用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中的一個包,能夠記錄字典元素插入的順序,常常和排序函數(shù)一起使用來生成一個排序的字典。
比如,比如一個無序的字典
d = {‘banana’:3,’apple’:4,’pear’:1,’orange’:2}
通過排序來生成一個有序的字典,有以下幾種方式
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ù)用于獲取對象的哪些維的數(shù)據(jù),參數(shù)為一些序號(即需要獲取的數(shù)據(jù)在對象中的序號),下面看例子。

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

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

  • 用 operator 函數(shù)進行多級排序
 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)]  
## 對字典排序
>>> 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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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

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