python數組排序方法之sort、sorted和argsort詳解
引言
這三個排序方法應對日常工作基本夠用
先說一下三者的區別
- sort, sorted 是用在 list 數據類型中的排序方法
- argsort 是用在 numpy 數據類型中的排序方法( numpy 裡也有一個 sort 方法,下面會講)
sort 和 sorted 的區別如下👇
先看兩個簡單的升序排序,分別使用 sorted 和 sort 方法
# sorted num_list = [1, 8, 2, 3, 10, 4, 5] ordered_list = sorted(num_list) print(ordered_list) # [1, 2, 3, 4, 5, 8, 10]
# sort num_list = [1, 8, 2, 3, 10, 4, 5] num_list.sort() print(num_list) # [1, 2, 3, 4, 5, 8, 10]
可以看出 sorted 並沒有修改原來的數組,而是將排序的結果作為參數傳遞給一個新的數組,而 sort 則在原數組上直接進行瞭排序
區別就是 sorted 需要一個變量接收排序結果,sort不用
建議使用 sorted,因為 sort 雖然代碼更簡潔,但是會修改原數組,這樣不靈活,如果你有多個地方同時使用瞭這個數組,那麼經過 sort 操作之後的數組就已經不是原來那個數組瞭,
debug的時候很麻煩,說完瞭區別,來具體講講使用方法
用法實例
1.升序排序
# sorted 升序排序 num_list = [1, 8, 2, 3, 10, 4, 5] ordered_list = sorted(num_list) print(ordered_list) # [1, 2, 3, 4, 5, 8, 10]
# sort 升序排序 num_list = [1, 8, 2, 3, 10, 4, 5] num_list.sort() print(num_list) # [1, 2, 3, 4, 5, 8, 10]
2.降序排序
# sorted 降序排序 num_list = [1, 8, 2, 3, 10, 4, 5] ordered_list = sorted(num_list, reverse=True) print(ordered_list) # [1, 2, 3, 4, 5, 8, 10]
# sort 降序排序 num_list = [1, 8, 2, 3, 10, 4, 5] num_list.sort(reverse=True) print(num_list) # [1, 2, 3, 4, 5, 8, 10]
3.如果不想要排序後的值,想要排序後的索引,可以這樣做
num_list = [1, 8, 2, 3, 10, 4, 5] ordered_list = sorted(range(len(num_list)), key=lambda k: num_list[k]) print(ordered_list) # [0, 2, 3, 5, 6, 1, 4]
4.字符串類型排序
# 字符串類型排序 str_list = ['1', '8', '2', '3', '10', '4', '5'] ordered_list = sorted(str_list) print(ordered_list) # ['1', '10', '2', '3', '4', '5', '8'] str_list = ['A', 'D', 'B', 'N', 'C', 'R', 'V'] ordered_list = sorted(str_list) print(ordered_list) # ['A', 'B', 'C', 'D', 'N', 'R', 'V']
5.二維數組排序
book_list = [ ['北大馬克思主義研究', '9787509728529', 2011], ['人的解放', '9787215064003', 2014], ['西方經典悅讀 資本論', '9787200092882', 2012], ['列寧的一生', '9787501319343', 2013], ] # sorted 按出版年升序排序 ordered_list = sorted(book_list, key=lambda book: book[2]) print(ordered_list) # [['北大馬克思主義研究', '9787509728529', 2011], ['西方經典悅讀 資本論', '9787200092882', 2012], ['列寧的一生', '9787501319343', 2013], ['人的解放', '9787215064003', 2014]] # sort 按出版年降序排序 book_list.sort(key=lambda book: book[2], reverse=True) print(book_list) # [['人的解放', '9787215064003', 2014], ['列寧的一生', '9787501319343', 2013], ['西方經典悅讀 資本論', '9787200092882', 2012], ['北大馬克思主義研究', '9787509728529', 2011]]
6.二維數組獲取排序後的索引
# sorted 獲取排序後的索引 book_list = [ ['北大馬克思主義研究', '9787509728529', 2011], ['人的解放', '9787215064003', 2014], ['西方經典悅讀 資本論', '9787200092882', 2012], ['列寧的一生', '9787501319343', 2013], ] ordered_list = sorted(range(len(book_list)), key=lambda k: book_list[k][2]) print(ordered_list) # [0, 2, 3, 1]
7.字典數組排序
book_list = [ {'name': '北大馬克思主義研究', 'isbn': '9787509728529', 'publish_year': 2011}, {'name': '人的解放', 'isbn': '9787215064003', 'publish_year': 2014}, {'name': '西方經典悅讀 資本論', 'isbn': '9787200092882', 'publish_year': 2012}, {'name': '列寧的一生', 'isbn': '9787501319343', 'publish_year': 2013}, ] # sorted 按出版年降序排序 ordered_list = sorted(book_list, key=lambda book: book['publish_year'], reverse=True) print(ordered_list) # [{'name': '人的解放', 'isbn': '9787215064003', 'publish_year': 2014}, {'name': '列寧的一生', 'isbn': '9787501319343', 'publish_year': 2013}, {'name': '西方經典悅讀 資本論', 'isbn': '9787200092882', 'publish_year': 2012}, {'name': '北大馬克思主義研究', 'isbn': '9787509728529', 'publish_year': 2011}] # sort 按出版年升序排序 book_list.sort(key=lambda book: book['publish_year']) print(book_list) # [{'name': '北大馬克思主義研究', 'isbn': '9787509728529', 'publish_year': 2011}, {'name': '西方經典悅讀 資本論', 'isbn': '9787200092882', 'publish_year': 2012}, {'name': '列寧的一生', 'isbn': '9787501319343', 'publish_year': 2013}, {'name': '人的解放', 'isbn': '9787215064003', 'publish_year': 2014}]
8.字典數組獲取排序後的索引
book_list = [ {'name': '北大馬克思主義研究', 'isbn': '9787509728529', 'publish_year': 2011}, {'name': '人的解放', 'isbn': '9787215064003', 'publish_year': 2014}, {'name': '西方經典悅讀 資本論', 'isbn': '9787200092882', 'publish_year': 2012}, {'name': '列寧的一生', 'isbn': '9787501319343', 'publish_year': 2013}, ] ordered_list = sorted(range(len(book_list)), key=lambda k: book_list[k]['publish_year']) print(ordered_list) # [0, 2, 3, 1]
9.對象排序
class Book(object): def __init__(self, name, isbn, publish_year): self.name = name self.isbn = isbn self.publish_year = publish_year def __repr__(self): return repr((self.name, self.isbn, self.publish_year)) book_list = [ Book('北大馬克思主義研究', '9787509728529', 2011), Book('人的解放', '9787215064003', 2014), Book('西方經典悅讀 資本論', '9787200092882', 2012), Book('列寧的一生', '9787501319343', 2013), ] # sorted 按出版年降序排序 ordered_list = sorted(book_list, key=lambda book: book.publish_year, reverse=True) print(ordered_list) # [('人的解放', '9787215064003', 2014), ('列寧的一生', '9787501319343', 2013), ('西方經典悅讀 資本論', '9787200092882', 2012), ('北大馬克思主義研究', '9787509728529', 2011)] # sort 按出版年升序排序 book_list.sort(key=lambda book: book.publish_year) print(book_list) # [('北大馬克思主義研究', '9787509728529', 2011), ('西方經典悅讀 資本論', '9787200092882', 2012), ('列寧的一生', '9787501319343', 2013), ('人的解放', '9787215064003', 2014)]
10.對象排序獲取排序後的索引
book_list = [ Book('北大馬克思主義研究', '9787509728529', 2011), Book('人的解放', '9787215064003', 2014), Book('西方經典悅讀 資本論', '9787200092882', 2012), Book('列寧的一生', '9787501319343', 2013), ] ordered_list = sorted(range(len(book_list)), key=lambda k: book_list[k].publish_year) print(ordered_list) # [0, 2, 3, 1]
11.一維數組排序【numpy】
numpy 隻有 sort 沒有 sorted,且 numpy 的 sort 方法 和 list 的 sorted 方法使用起來類似
import numpy as np # 一維數組 num_list = np.array([1, 8, 2, 3, 10, 4, 5]) index_list = np.sort(num_list) print(index_list) # [ 1 2 3 4 5 8 10]
12.一維數組獲取排序後的索引【numpy】
num_list = np.array([1, 8, 2, 3, 10, 4, 5]) index_list = np.argsort(num_list) print(index_list) # [0 2 3 5 6 1 4]
13.一維數組降序排序【numpy】
# # 降序排序 num_list = np.array([1, 8, 2, 3, 10, 4, 5]) index_list = np.argsort(-num_list) # 加負號按降序排序 print(index_list) # [4 1 6 5 3 2 0]
14.二維數組排序【numpy】
num_list = np.array([ [1, 8, 2, 9], [8, 2, 4, 5], [2, 3, 7, 4], [1, 2, 3, 5] ]) ordered_list = np.sort(num_list, axis=0) # axis=0 是按列排序 print(ordered_list) # [[1 2 2 4] # [1 2 3 5] # [2 3 4 5] # [8 8 7 9]] ordered_list = np.sort(num_list, axis=1) # axis=1 是按行排序 print(ordered_list) # [[1 2 8 9] # [2 4 5 8] # [2 3 4 7] # [1 2 3 5]]
15.二維數組獲取排序後的索引【numpy】
num_list = np.array([ [1, 8, 2, 9], [8, 2, 4, 5], [2, 3, 7, 4], [1, 2, 3, 5] ]) ordered_list = np.argsort(num_list, axis=0) # axis=0 是按列排序 print(ordered_list) # [[0 1 0 2] # [3 3 3 1] # [2 2 1 3] # [1 0 2 0]] ordered_list = np.argsort(num_list, axis=1) # axis=1 是按行排序 print(ordered_list) # [[0 2 1 3] # [1 2 3 0] # [0 1 3 2] # [0 1 2 3]]
附:python對數組進行排序,並輸出排序後對應的索引值
# -*- coding: cp936 -*- import numpy as np #一維數組排序 arr = [1, 3, 5, 2, 4, 6] arr = np.array(arr) print arr print np.sort(arr)#或print np.sort(arr,axis=None) print (np.argsort(arr)) # 正序輸出索引,從小到大 print (np.argsort(-arr)) # 逆序輸出索引,從大到小
輸出結果:
[1 3 5 2 4 6]
[1 2 3 4 5 6]
[0 3 1 4 2 5]
[5 2 4 1 3 0]
#二維數組排序 list1 = [[4,3,2],[2,1,4]] array=np.array(list1) print array array.sort(axis=1) #axis=1按行排序,axis=0按列排序 print array
輸出結果:
[[4 3 2]
[2 1 4]][[2 3 4]
[1 2 4]]
總結
到此這篇關於python數組排序方法之sort、sorted和argsort詳解的文章就介紹到這瞭,更多相關python數組排序方法內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 如何獲取numpy array前N個最大值
- Python列表排序 list.sort方法和內置函數sorted用法
- Python Numpy教程之排序,搜索和計數詳解
- 淺談numpy.where() 的用法和np.argsort()的用法說明
- python中sort()函數用法詳解