[Python]對容器內數據的排序有兩種,一種是容器自己的sort函數,一種是內建的sorted函數。
sort函數和sorted函數唯一的不同是,sort是在容器內排序,sorted生成一個新的排好序的容器。
對于一個簡單的數組 L=[5,2,3,1,4].
sort: L.sort()
sorted(...)
sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
iterable:待排序的可迭代類型的容器;
cmp:用于比較的函數,比較什么由key決定,有默認值,迭代集合中的一項;
key:用列表元素的某個已命名的屬性或函數(只有一個參數并且返回一個用于排序的值)作為關鍵字,有默認值,迭代集合中的一項;
reverse:排序規(guī)則. reverse = True 或者 reverse = False,有默認值。
返回值:是一個經過排序的可迭代類型,與iterable一樣。
如果是一個多維的列表 L=[(‘b’,2),(‘a’,1),(‘c’,3),(‘d’,4)].
有三種選擇對這個多維列表進行排序
利用cmp函數
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]);
反序
以上幾種排序均可加上參數reverse.
例如 sorted(reverse=True), L.sort(reverse=True). 或者改成False
OrderedDict是collections中的一個包,能夠記錄字典元素插入的順序,常常和排序函數一起使用來生成一個排序的字典。
比如,比如一個無序的字典
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函數
operator模塊提供的itemgetter函數用于獲取對象的哪些維的數據,參數為一些序號(即需要獲取的數據在對象中的序號),下面看例子。
a = [1,2,3]
b=operator.itemgetter(1) //定義函數b,獲取對象的第1個域的值> b(a)
2
b=operator.itemgetter(1,0) //定義函數b,獲取對象的第1個域和第0個的值
b(a)
(2, 1)
要注意,operator.itemgetter函數獲取的不是值,而是定義了一個函數,通過該函數作用到對象上才能獲取值。
- 用 operator 函數進行多級排序
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)]