首頁  >  文章  >  後端開發  >  詳解Python中的sort()使用方法

詳解Python中的sort()使用方法

高洛峰
高洛峰原創
2017-05-25 11:14:313266瀏覽

一、基本形式

sorted(iterable[, cmp[, key[, reverse]]])
iterable.sort(cmp[, key[, reverse]])


參數解釋:
(1)iterable指定要排序的list或iterable,不用多說;
(2 )cmp為函數,指定排序時進行比較的函數,可以指定一個函數或lambda函數,如:
      students為類別物件的list,沒個成員有三個域,用sorted進行比較時可以自己設定cmp函數,例如這裡要透過比較第三個資料成員來排序,程式碼可以這樣寫:

students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
sorted(students, key=lambda student : student[2])


(3)key為函數,指定取待排序元素的哪一項進行排序,函數用上面的範例來說明,程式碼如下:

sorted(students, key=lambda student : student[2])


      key指定的lambda函數功能是去元素student的第三個域(即:student[2]),因此sorted排序時,會以students所有元素的第三個域來進行排序。
二、普通用法:
1.原址排序
1)列表有自己的sort方法,其對列表進行原址排序,既然是原址排序,那顯然元組不可能擁有這種方法,因為元組是不可修改的。

x = [4, 6, 2, 1, 7, 9]
x.sort()
print x # [1, 2, 4, 6, 7, 9]


2.副本排序
1)[:]分片方法

x =[4, 6, 2, 1, 7, 9]
y = x[ : ]
y.sort()
print y #[1, 2, 4, 6, 7, 9]
print x #[4, 6, 2, 1, 7, 9]


注意:y = x[:] 透過分片操作將列表x的元素全部拷貝給y,如果簡單的把x賦值給y:y = x,y和x還是指向同一個列表,並沒有產生新的副本。
2)sorted方法
sorted傳回有序的副本,且類型總是列表,如下:

x =[4, 6, 2, 1, 7, 9]
y = sorted(x)
print y #[1, 2, 4, 6, 7, 9]
print x #[4, 6, 2, 1, 7, 9] 
print sorted('Python') #['P', 'h', 'n', 'o', 't', 'y']


三、進階用法
1.自訂cmp比較函數

def comp(x, y):
if x < y:
return 1
elif x > y:
return -1
else:
return 0
nums = [3, 2, 8 ,0 , 1]
nums.sort(comp)
print nums # 降序排序[8, 3, 2, 1, 0]
nums.sort(cmp) # 调用内建函数cmp ,升序排序
print nums # 降序排序[0, 1, 2, 3, 8]


2.自訂key和reverse
1.reverse實作降序排序,需要提供一個布林值,預設為False(升序排列)。
2.key在使用時必須提供一個排序過程總呼叫的函數:

alist = [('2', '3', '10'), ('1', '2', '3'), ('5', '6', '7'), ('2', '5', '10'), ('2', '4', '10')]
# 多级排序,先按照第3个元素排序,然后按照第2个元素排序:
print sorted(alist, cmp = None, key = lambda x:(int(x[2]), int(x[1])), reverse = False)
-------------------------------------------------------------------------------------------
[('1', '2', '3'), ('5', '6', '7'), ('2', '3', '10'), ('2', '4', '10'), ('2', '5', '10')]


四、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函數取得的不是值,而是定義了一個函數,透過該函數作用到物件上才能取得值。
itemgetter在sort中的用法:

from operator import itemgetter
alist = [('2', '3', '10'), ('1', '2', '3'), ('5', '6', '7'), ('2', '5', '10'), ('2', '4', '10')]
# 多级排序,先按照第3个元素排序,然后按照第2个元素排序:
print sorted(alist, cmp = None, key = itemgetter(2, 1), reverse = False)
print sorted(alist, cmp = None, key = lambda x:itemgetter(2, 1)(x), reverse = False)
print sorted(alist, cmp = None, key = lambda x:map(int, itemgetter(2, 1)(x)), reverse = False)
--------------------------------------------------------------------------------------------------
[('2', '3', '10'), ('2', '4', '10'), ('2', '5', '10'), ('1', '2', '3'), ('5', '6', '7')]
[('2', '3', '10'), ('2', '4', '10'), ('2', '5', '10'), ('1', '2', '3'), ('5', '6', '7')]
[('1', '2', '3'), ('5', '6', '7'), ('2', '3', '10'), ('2', '4', '10'), ('2', '5', '10')]


以上所述是小編給大家介紹的Python中的sort()方法使用基礎,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回覆大家的!

【相關建議】

1. 分享python中sort的使用方法實例

2. 詳解Python中使用values()的實例教學

#3. 在pandas的DataFrame中sort_values isin的使用實例

以上是詳解Python中的sort()使用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn