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