# 你真的了解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)