Python排序應用(教學篇)
排序就是讓資料排隊,可以從最大排到最小,那還有哪些排序技巧?一同來學習python程式設計sort()和sorted()排序應用。2020/11/18(修)

...
相信你對於python已經有相當程度認識,也了解python可支援多種不同的資料型態,這次程式範例就來使用容器型態(Container type)資料tuple(元祖)、list(串列)、set(集合)、dict(字典)。文章將分成三個主題來介紹,從認識基本排序應用到進階排序操作說明。
主題一、認識基本排序應用
sort()僅支援list資料型態,將會修改原始資料,返回值為"None"。
sorted()可支援tuple、list、set、dict資料型態,將不會修改原始資料,返回值為list型態。
原始語法
sort(*, key=None, reverse=False)
sorted(iterable, *, key=None, reverse=False)
定義範例中變數和資料型態:
#tuple資料型態 data_t = ( 5, 9, 1, 11, 3, 2, 8, 4, 22 ) #list資料型態 data_l = [ 5, 9, 1, 11, 3, 2, 8, 4, 22 ] #set資料型態 data_s = { 5, 9, 1, 11, 3, 2, 8, 4, 22} #dict資料型態 data_d = { 'b':5, 'c':9, 'g':1, 'i':11, 'e':3, 'a':2 }
sort()基本範例應用
範例1、sort()處理list資料型態排序應用
data_l.sort() print(data_l) ''' [1, 2, 3, 4, 5, 8, 9, 22] ''' #直接印出,將取得 None print( data_l.sort() ) ''' None '''
範例2、sort()不支援tuple、set、dict資料型態,實際執行將會出現錯誤
data_t.sort() ''' Exception has occurred: AttributeError 'tuple' object has no attribute 'sort' ''' data_s.sort() ''' Exception has occurred: AttributeError 'set' object has no attribute 'sort' ''' data_d.sort() ''' Exception has occurred: AttributeError 'dict' object has no attribute 'sort' '''
sorted()基本範例應用
範例3、sorted()處理tuple資料型態排序應用
data_t_s = sorted(data_t) print(‘原始資料:’,data_t) print(‘排序後資料:’,data_t_s) ''' 原始資料: (5, 9, 1, 11, 3, 2, 8, 4, 22) 排序後資料: [1, 2, 3, 4, 5, 8, 9, 11, 22] '''
範例4、sorted()處理list資料型態排序應用
data_l_s = sorted(data_l) print(‘原始資料:’,data_l) print(‘排序後資料:’,data_l_s) ''' 原始資料: [5, 9, 1, 11, 3, 2, 8, 4, 22] 排序後資料: [1, 2, 3, 4, 5, 8, 9, 11, 22] '''
範例5、sorted()處理set資料型態排序應用
set的資料若都是整數時,直接輸出也會有排序效果
data_s_s = sorted(data_s) print(‘原始資料:‘,data_s) print(‘排序後資料:‘,data_s_s) ''' 原始資料: {1, 2, 3, 4, 5, 8, 9, 11, 22} 排序後資料: [1, 2, 3, 4, 5, 8, 9, 11, 22] '''
範例6、sorted()處理dict資料型態排序應用,使用key來比對排序(預設值)
data_d_s = sorted(data_d) data_d_s = sorted(data_d) print('原始資料:', data_d) print('排序後資料:', data_d_s) ''' 原始資料: {'b': 5, 'c': 9, 'g': 1, 'i': 11, 'e': 3, 'a': 2} 排序後資料: ['a', 'b', 'c', 'e', 'g', 'i'] '''
範例7、sorted()處理dict資料型態排序應用,使用values來比對排序
data_d_s = sorted(data_d.values()) print('原始資料:',data_d) print('排序後資料:',data_d_s) ''' 原始資料: {'b': 5, 'c': 9, 'g': 1, 'i': 11, 'e': 3, 'a': 2} 排序後資料: [1, 2, 3, 5, 9, 11] '''
...
主題二、升幕降幕排序操作
前面的範例排序結果都是從小排到大,那可以設計讓資料從大排到小。另一方面來探討若排序的資料是字元,那「字元」可以進行排序嗎?
原始語法
sort(*, key=None, reverse=False)
sorted(iterable, *, key=None, reverse=False)
設定方法說明
設定reverse=False,使用Ascending排序
設定reverse=True,使用Descending排序
無指定reverse參數,預設為Ascending排序
排序方法說明
Ascending(昇幕)排序,表示排序方式從小排到大
Descending(降幕)排序,表示排序方式從大排到小
數值資料的排序操作
範例1、數值排序的Ascending和Descending應用
data_l = [ 5, 9, 1, 11, 3, 2, 8, 4, 22 ] data_l_s1 = sorted(data_l) data_l_s2 = sorted(data_l, reverse=False ) data_l_s3 = sorted(data_l, reverse=True) print('原始資料:', data_l) print('昇幕排序(無指定):', data_l_s1) print('昇幕排序:', data_l_s2) print('降幕排序:', data_l_s3) ''' 原始資料: [5, 9, 1, 11, 3, 2, 8, 4, 22] 昇幕排序(無指定): [1, 2, 3, 4, 5, 8, 9, 11, 22] 昇幕排序: [1, 2, 3, 4, 5, 8, 9, 11, 22] 降幕排序: [22, 11, 9, 8, 5, 4, 3, 2, 1] '''
字元資料的排序操作
範例2、字元排序的Ascending和Descending應用
data_l = [ 'g', 'f', 'z', 'b', 'a', 'd', 'c', 'e', 'h' ] data_l_s2 = sorted(data_l, reverse=False ) data_l_s3 = sorted(data_l, reverse=True) print('昇幕排序:', data_l_s2) print('降幕排序:', data_l_s3) ''' 昇幕排序: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'z'] 降幕排序: ['z', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a'] '''
思考一下數字排序比對大小,沒有任何問題;那字元如何進行排序作業?也是比對大小嗎!
資料 > ASCII 碼 > 排序比對
python使用sort()和sorted()進行排序應用,比對資料的大小進行排序作業,那「字元」是如何判斷大小呢?
當進行排序作業時,會先將資料轉換成ASCII碼,資料轉換成ASCII碼後就會產生一個對應的數字,就能用來判斷大小。學習計算機概論課程時,一定都有背過這段ASCII對應碼「 0 對應 48(十進位)、'A'對應 65(十進位)、'a'對應 97(十進位)」。
data_l = [ 'a', 'A' ] data_l_s2 = sorted(data_l, reverse=False) data_l_s3 = sorted(data_l, reverse=True) print('昇幕排序:',data_l_s2) print('降幕排序:',data_l_s3) ''' 昇幕排序: ['A', 'a'] 降幕排序: ['a', 'A'] '''
...
主題三、排序變化應用
sort()和sorted()除了基本排序功能,還可以運用key參數來設計更進階的排序應用,介紹幾個比較常用的來說明。
原始語法
sort(*, key=None, reverse=False)
sorted(iterable, *, key=None, reverse=False)
範例1、將比對的資料換成小寫(不會改變資料),再進行排序比對。設定方法key=str.lower
data_k_1 = ['b','Boy','Apple','a'] print('原始資料:', data_k_1) print('排序後資料:', sorted(data_k_1)) print('特殊排序後資料:', sorted(data_k_1, key=str.lower)) ''' 原始資料: ['b', 'Boy', 'Apple', 'a'] 排序後資料: ['Apple', 'Boy', 'a', 'b'] 特殊排序後資料: ['a', 'Apple', 'b', 'Boy'] '''
範例2、依資料長度來進行排序比對。設定方法 key=len
data_k_2 = ['b','Boy','Apple','a'] print('原始資料:',data_k_2) print('特殊排序後資料:',sorted(data_k_2, key=len, reverse=True)) ''' 原始資料: ['b', 'Boy', 'Apple', 'a'] 特殊排序後資料: ['Apple', 'Boy', 'b', 'a'] '''
範例3、依資料中指定欄位來進行排序比對。設定方法 key=lambda x:x[1]
data_k_3 = { 'b':5, 'c':2, 'g':1, 'i':11, 'e':3, 'a':2} data_k_3_s = sorted(data_k_3.items(), key=lambda x: x[1]) print('原始資料:', data_k_3) print('排序後資料:', data_k_3_s) ''' 原始資料: {'b': 5, 'c': 2, 'g': 1, 'i': 11, 'a': 2} 排序後資料: [('g', 1), ('c', 2), ('a', 2), ('b', 5), ('i', 11)] '''
...
「資料」的產生是用來紀錄用,「資訊」是從一堆資料中彙整而成,「分析」作業就是將一堆資料變成重要資訊的轉換過程!過程中可能會運用到一至多種方法來處理資料,「排序」就是其中一種方法。希望這篇文章能幫助你更進一步認識Python排序應用。
不要忘記!自己動動腦、動動手,相信你將會有更多的體驗與收獲滿滿
大家都能愛編程、愛思考、愛創造