專項練習 · 7 分鐘閱讀

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])))

先價格,再名稱

你的練習清單

常見問題

為什麼列表變成了 None?

你可能把 sort() 的結果賦回了列表。單獨呼叫 items.sort(),或者用 items = sorted(items)。

怎樣按元組的第二項排序?

用 key=lambda item: item[1]。lambda 回傳 Python 應該比較的欄位。

zip 會按較長的列表繼續嗎?

不會。zip 在最短輸入耗盡時停止,缺失的值會被靜默忽略。

練習排序

12 道題,覆蓋 sorted、sort、key 函式、reverse、zip 和 enumerate。

打開練習

繼續閱讀: