^

Python排序應用(教學篇)

HiThink-logo
海獅程式團隊
Jun 30,2020

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

Python教學-排序應用
Python排序應用sort()和sorted()

...

相信你對於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排序應用。

不要忘記!自己動動腦、動動手,相信你將會有更多的體驗與收獲滿滿

大家都能愛編程、愛思考、愛創造

延伸閱讀