sort()函數與sorted()函數的區別
sort()是List對象的方法
sorted()只要是可迭代對象就可以,使用范圍比sort()函數更廣
List的sort()函數定義與用法:
Python源碼builtins.py文件對sort()函數的定義如下
def sort(self, key=None, reverse=False): """ L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE* """ pass
可以看出:sort()函數沒有返回值,有兩個參數。key表示的是排依據的函數;reverse是指需不需要反轉列表,默認為False表示的是升序,如果設為True表示的是降序。
sort()用法如下
L = [1, 2, 7, 4, 3] L.sort() print(L) #[1, 2, 3, 4, 7] 我們加入一些參數來看看,如降序排序: L = [1, 2, 7, 4, 3] L.sort(reverse=True) print(L) #[7, 4, 3, 2, 1] 通過key來實現降序排序,這里用到匿名函數lambda: L = [1, 2, 7, 4, 3] L.sort(key=lambda x : x*(-1)) print(L) #[7, 4, 3, 2, 1]
將key設為內置函數或者自定義函數,比如用絕對值函數:
L = [-1, 2, -7, 4, 3] L.sort(key=abs) print(L) #[-1, 2, 3, 4, -7]
Python3對key的還有另外一種支持,就是通過functools模塊的cmp_to_key函數,將傳統的cmp函數轉為key。這和lambda函數用法類似,但是對於比較的邏輯比較復雜的情況,這樣的方式會更清晰更便於維護。
from functools import cmp_to_key L = [-1, 2, -7, 4, 3] def cmp(a,b): if abs(a) < abs(b): return -1 else: return 1 L.sort(key=cmp_to_key(cmp)) print(L)
二.sorted()
官方文檔
sorted(iterable,*,key = None,reverse = False ) 從iterable中的項目返回一個新的排序列表。 有兩個可選參數,必須將其指定為關鍵字參數。 key指定一個參數的功能,該參數用於從iterable中的每個元素中提取一個比較鍵(例如key=str.lower)。默認值為None(直接比較元素)。 reverse是一個布爾值。如果設置為True,則對列表元素進行排序,就好像每個比較都被反轉一樣。 用functools.cmp_to_key()一個老式的轉換CMP功能的 關鍵功能。 內置sorted()功能保證穩定。如果可以保證不更改比較相等的元素的相對順序,則排序是穩定的-這有助於多次通過排序(例如,按部門排序,然后按薪級排序)。
sorted()返回值為List類型。參數列表iterable表示可迭代對象;*表示位置參數就此終結,后面的參數都必須用關鍵字來指定;key與reverse參數用法與sort()完全一致。
對字典進行value值排序(默認是通過key值排序)
Dict = {'a':2, 'b':3, 'c':7, 'd':4, 'e':1} L = sorted(Dict.items(), key=lambda x : x[1]) print(L) #[('e', 1), ('a', 2), ('b', 3), ('d', 4), ('c', 7)]
面試題:
對一個字符串進行統計,並且按照字符的數量依次排序
bbb='qqwwwwweredfdfhfgooooooooooo' #對bbb列表里的子字符進行排序 L = sorted(bbb) ll=[] dic={} count=0 for i in L: #每運行一次+1,統計運行次數 count += 1 #當ll列表內沒有值時 if len(ll)==0: ll.append(i) #當i不再ll列表內時統計列表長度,並加入字典,然后清空,再將i加入列表 elif i not in ll: dic[ll[0]]=len(ll) ll.clear() ll.append(i) #當i再列表內時,並且count小於列表總長度 elif count<len(L): ll.append(i) #當i為列表內最后一個值 elif i == L[-1] and count==len(L): ll.append(i) dic[ll[0]] = len(ll) print(dic.items()) bbb=sorted(dic.items(),key=lambda x:x[1]) print(bbb)