1. 程式人生 > >python3----函數(sort和sorted)

python3----函數(sort和sorted)

cut 組類型 att 通過 都沒有 理解 getitem 模塊 並且

在學習python的過程中,感覺python中的排序相和c++中的泛型算法還是比較相似的,但相對於c++而言更加簡單易用。

python中列表的內置函數sort()可以對列表中的元素進行排序,而全局性的sorted()函數則對所有可叠代的序列都是適用的;並且sort()函數是內置函數,會改變當前對象,而sorted()函數只會返回一個排序後的當前對象的副本,而不會改變當前對象。

1、內置函數sort()

原型:sort(fun,key,reverse=False)

參數fun是表明此sort函數是基於何種算法進行排序的,一般默認情況下python中用的是歸並排序,並且一般情況下我們是不會重寫此參數的,所以基本可以忽略;

參數key用來指定一個函數,此函數在每次元素比較時被調用,此函數代表排序的規則,也就是你按照什麽規則對你的序列進行排序;

參數reverse是用來表明是否逆序,默認的False情況下是按照升序的規則進行排序的,當reverse=True時,便會按照降序進行排序。

下面 通過簡單的例子進行解說:

 1 from operator import attrgetter,itemgetter
 2 
 3 list1 = [(2,huan,23),(12,the,14),(23,liu,90)]
 4 
 5 #使用默認參數進行排序,即按照元組中第一個元素進行排序
 6 list1.sort()
7 print(list1) 8 #輸出結果為[(2, ‘huan‘, 23), (12, ‘the‘, 14), (23, ‘liu‘, 90)] 9 10 #使用匿名表達式重寫key所代表的函數,按照元組的第二個元素進行排序 11 list1.sort(key=lambda x:(x[1])) 12 print(list1) 13 #[(2, ‘huan‘, 23), (23, ‘liu‘, 90), (12, ‘the‘, 14)] 14 15 #使用匿名表達式重寫key所代表的函數,按照元組的第三個元素進行排序 16 list1.sort(key=lambda x:(x[2]))
17 print(list1) 18 #[(12, ‘the‘, 14), (2, ‘huan‘, 23), (23, ‘liu‘, 90)] 19 20 #使用匿名函數重寫key所代表的函數,先按照元組中下標為2的進行排序, 21 # 對於下標2處元素相同的,則按下標為0處的元素進行排序 22 list1.sort(key=lambda x:(x[2],x[0])) 23 print(list1) 24 #[(12, ‘the‘, 14), (2, ‘huan‘, 23), (23, ‘liu‘, 90)] 25 26 #使用operator模塊中的itemgetter函數進行重寫key所代表的函數,按照下標為1處的元素進行排序 27 list1.sort(key=itemgetter(1)) 28 print(list1) 29 #[(2, ‘huan‘, 23), (23, ‘liu‘, 90), (12, ‘the‘, 14)] 30 31 #使用operator模塊中的itemgetter函數進行重寫key所代表的函數,按照下標為2處的元素進行排序 32 list1.sort(key=itemgetter(2)) 33 print(list1) 34 # [(12, ‘the‘, 14), (2, ‘huan‘, 23), (23, ‘liu‘, 90)] 35 36 # 此處可以類比lambda中的排序方法,就不再解釋 37 list1.sort(key=itemgetter(2,0)) 38 print(list1) 39 #[(12, ‘the‘, 14), (2, ‘huan‘, 23), (23, ‘liu‘, 90)]

對於上述中的匿名函數大家如果 不了解的可以自己去了解一下,這裏我就不展開了。

這裏我想解釋一下operator這個模塊中的兩個函數:

(1)itemgetter

operator.itemgetter(item)operator.itemgetter(*items)這個函數會調用所傳入的操作數的__getitem__()方法返回一個帶有item的可調用對象,如果傳入的參數是多個,那麽返回帶有一個元組類型的可調用對象。例如: f = itemgetter(2), 調用 f(r) 後,將會返回r[2] g = itemgetter(2, 5, 3), 調用 g(r) 後將會返回元組 (r[2], r[5], r[3]). (2)attrgetteroperator.attrgetter(attr)operator.attrgetter(*attrs)這個函數返回一個帶有操作數中的attr屬性的可調用對象,如果多個屬性被傳入,那麽返回帶有這些屬性的元組。這些屬性的名字裏可以包含包含多個子名字例如:f = attrgetter(‘name‘), 調用f(b) 將返回b.name.f = attrgetter(‘name‘, ‘date‘), 調用 f(b) 將返回(b.name, b.date).f = attrgetter(‘name.first‘, ‘name.last‘), 調用f(b) 將返回 (b.name.first, b.name.last).

2、全局函數sorted()

對於sorted()函數中key的重寫,和sort()函數中是一樣的,所以剛剛對於sort()中講解的方法,都是適用於sorted()函數中,在下面的解釋中我也就不再列舉了,並且下面將要講解的key的重寫也同樣是適用於sort()函數的,那麽為什麽不再sort()函數中列舉完呢,那是為了不偏不倚,給大家一個客觀地理解。

下面仍然從一個例子切入:

 1 from operator import attrgetter
 2 class Data:
 3     article_name = str()
 4     readers = 0
 5     def __init__(self,tpl):
 6         self.article_name = tpl[0]
 7         self.readers = tpl[1]
 8     def getKey(self):
 9         return self.readers
10     def __str__(self):
11         return str(str(self.article_name)+str(:)+str(self.readers))
12 
13 list1 = [Data(("java",100)),Data(("c++",100)),Data(("python",89)),Data(("c++",90))]
14 
15 #此處調用attrgetter函數使得按照readers進行排序
16 list2 = sorted(list1,key=attrgetter("readers"))
17 """結果為
18 python:89
19 c++:90
20 java:100
21 c++:100
22 """
23 
24 #此處使得list1先按照article_name進行排序,對於名字相同的再按照readers進行排序
25 list3 = sorted(list1,key=attrgetter("article_name","readers"))
26 """
27 結果為:
28 c++:90
29 c++:100
30 java:100
31 python:89
32 """
33 
34 #使用類中的自定義函數也同樣可以操作
35 list4 = sorted(list1,key = Data.getKey)
36 """
37 結果為:
38 python:89
39 c++:90
40 java:100
41 c++:100
42 """

上面例子的結果都是通過打印出來的結果。

對於sorted()函數,同樣可以使用sort()函數中介紹的方法,大家可以自己進行嘗試。

當然最後說一下,在上面所有的例子中我都沒有使用到reverse參數,對於這個參數,是用於控制排序的方向的,大家可以自己試試,在這裏也就不介紹了。

python3----函數(sort和sorted)