[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)]