Python 排序練習:key、reverse 與記錄排序
給數字列表排序只是第一步。真正有用的是按指定欄位排序記錄,同時保留原始資料。
sorted 還是 sort?
sorted 回傳新列表;sort 修改原列表並回傳 None。根據原順序是否還有用來選擇。排序前後各列印一次,就能看清區別。
prices = [6.0, 4.5, 3.25]
print(sorted(prices))
print(prices)新列表與原列表
按欄位排序記錄
傳入一個 key 函式,回傳要比較的欄位。短規則用 lambda 就夠了。記錄本身不會改變;Python 只在排序時使用回傳的鍵。
orders = [("latte", 4.5), ("tea", 3.0), ("mocha", 5.0)]
for name, price in sorted(orders, key=lambda item: item[1]):
print(name, price)按價格排序
倒序與極值
reverse=True 會反轉順序。min 和 max 回傳元素,而不是排序列表。記錄需要比較時,給 min 或 max 也傳 key,指定按哪個欄位取極值。
prices = [4.5, 6.0, 3.25]
print(sorted(prices, reverse=True))
print(max(prices))降序與最大值
用 zip 與 enumerate 配對資料
zip 把同一位置的值配對,enumerate 添加索引。報表既需要行號又需要兩個相關欄位時,可以組合使用。長度不一致時,以較短的序列為準。
names = ["latte", "tea"]
prices = [4.5, 3.0]
for i, (name, price) in enumerate(zip(names, prices), 1):
print(i, name, price)帶編號的配對
保留穩定的次級排序
需要多個欄位時,key 可以回傳元組。Python 先比較第一個元素,再比較下一個。這樣就能按價格、再按名稱排序,而不用寫自定義比較函式。
orders = [("latte", 4.5), ("tea", 4.5), ("mocha", 3.0)]
print(sorted(orders, key=lambda item: (item[1], item[0])))先價格,再名稱
你的練習清單
- 需要保留原順序時用 sorted。
- 傳給 key 的是函式,不是函式呼叫結果。
- 降序使用 reverse=True。
- 需要多個排序欄位時,讓 key 回傳元組。
常見問題
為什麼列表變成了 None?
你可能把 sort() 的結果賦回了列表。單獨呼叫 items.sort(),或者用 items = sorted(items)。
怎樣按元組的第二項排序?
用 key=lambda item: item[1]。lambda 回傳 Python 應該比較的欄位。
zip 會按較長的列表繼續嗎?
不會。zip 在最短輸入耗盡時停止,缺失的值會被靜默忽略。
練習排序
12 道題,覆蓋 sorted、sort、key 函式、reverse、zip 和 enumerate。
繼續閱讀: