# 你真的了解python的排序嗎? [python官方文檔](https://docs.python.org/zh-tw/3/howto/sorting.html) ## sort跟sorted的差異 | 特色\類別 | sort | sorted | | --------- |:-------------- | ----------------- | | 使用對象 | list | 任何可迭代物件 | | 使用時機 | 可改變原始list | 不可改變原始物件 | | 使用方式 | list.sort() | 物件=sorted(物件) | 使用方式如下 : ```python= l = [1,5,2,6,3,7,4,8,9] l2 = sorted(l) # [1,2,3,4,5,6,7,8,9] l.sort() # [1,2,3,4,5,6,7,8,9] ``` ## sort內建的功能 sort內建下面兩個函數,可以讓sort執行**多功能的排序** * key (比較) * reverse(翻轉) ```python= l = [1,5,2,6,3,7,4,8,9] l.sort(key=lambda x:x,reverse=False) # 預設情況 sorted(l,key=lambda x:x,reverse=False) # 預設情況 # 大到小排序 l.sort(reverse=True) # 或是 l.sort(key=lambda x:-x) ``` key的進一步使用就是**對於陣列內元素的運用** 比如我的陣列內存放著許多 (姓名,分數) 的資料 我想要依照分數來做排序,就可以使用下述的方式 : key = lambda x : x[ 1 ] 這裡的x是指陣列當中的元素,所以x[ 1 ]就是不同的分數,並以此為比較方式 如果要**同時比較多個元素**,比如 (姓名,數學分數,英文分數) 的資料 想要達到先比較數學分數,假如數學分數相同就比較英文分數 那可以使用下述的方式 : key = lambda x : (x[1],x[2]) 那我們來看一些考試常用的應用 比如我們有座標需要排序,可能有不同要求,比如下面四種方式 * 先比較x在比較y * 只比較x * 只比較y * 比較x+y 直接看程式碼 : ```python= # 六個座標 # 比較x在比較y l = [(4,1), (1,3), (1,1), (2,1), (2,4), (3,90)] l.sort(key=lambda x : (x[0],x[1]) ) print(f"x and y: {l}") # [(1, 1), (1, 3), (2, 1), (2, 4), (3, 90), (4, 1)] # 內建sort l = [(4,1), (1,3), (1,1), (2,1), (2,4), (3,90)] l.sort() print(f"The normal: {l}") # [(1, 1), (1, 3), (2, 1), (2, 4), (3, 90), (4, 1)] # 只比較x l = [(4,1), (1,3), (1,1), (2,1), (2,4), (3,90)] l.sort(key=lambda x : x[0] ) print(f"x: {l}") # [(1, 3), (1, 1), (2, 1), (2, 4), (3, 90), (4, 1)] # 只比較y l = [(4,1), (1,3), (1,1), (2,1), (2,4), (3,90)] l.sort(key=lambda x : x[1] ) print(f"y: {l}") # [(4, 1), (1, 1), (2, 1), (1, 3), (2, 4), (3, 90)] # 比較x+y l = [(4,1), (1,3), (1,1), (2,1), (2,4), (3,90)] l.sort(key=lambda x : x[0]+x[1] ) print(f"x+y: {l}") # [(1, 1), (2, 1), (1, 3), (4, 1), (2, 4), (3, 90)] ``` 觀察上述程式碼的輸出可以發現兩個重點 1. 內建的sort跟同時比較x跟y的結果一樣 2. 如果只比較單一的元素,如果單一元素相同,其他排序則照原本list 到這裡已經涵蓋APCS所需的範圍了,如果對於更多應用有興趣,可以去看[python官方文檔](https://docs.python.org/zh-tw/3/howto/sorting.html)