1. はじめに
Python 因其簡潔且彈性的語法,受到許多開發者的喜愛。特別是「字典(dict)」是一種用來管理鍵值對的便利資料結構,能有效提升資料整理與存取的效率。然而,在撰寫程式的過程中,我們常會遇到「希望將字典依照特定順序排序」的需求。
例如,如果想要排序學生的成績單或商品的價格表,就需要依照鍵或值的順序來整理資料。在這種情況下,Python 的「字典排序」功能就派上用場了。
本文將詳細介紹如何使用 Python 根據鍵或值來排序字典。從基礎用法到進階範例,並搭配實際程式碼說明,讓初學者到中階使用者都能輕鬆理解,歡迎閱讀到最後!
2. 辞書のソート方法
在 Python 中,排序字典主要使用 sorted()
函數。以下將依照鍵與值的不同排序方式,逐步進行說明。
2.1 辞書のキーでソートする方法
若要依照鍵進行排序,可以使用以下的程式碼:
sample_dict = {'apple': 3, 'banana': 1, 'cherry': 2}
sorted_by_key = dict(sorted(sample_dict.items(), key=lambda x: x[0]))
print(sorted_by_key)
結果:
{'apple': 3, 'banana': 1, 'cherry': 2}
程式碼說明:
sample_dict.items()
會以鍵值對的形式取得字典的項目。sorted()
函數根據鍵(x[0]
)進行排序。- 最後使用
dict()
將排序後的項目重新組成字典。
此方法會按照英文字母順序排序,當你想要控制鍵的排列順序時非常有用。
2.2 辞書の値でソートする方法
若要依據值進行排序,可以使用以下程式碼:
sample_dict = {'apple': 3, 'banana': 1, 'cherry': 2}
sorted_by_value = dict(sorted(sample_dict.items(), key=lambda x: x[1]))
print(sorted_by_value)
結果:
{'banana': 1, 'cherry': 2, 'apple': 3}
程式碼說明:
- 使用
key=lambda x: x[1]
來指定排序依據為「值」。 - 會依照數值由小到大排序,適合用於排行榜或數值比較等情境。
2.3 operator
モジュールを使用したソート
若希望更有效率地排序,可使用 Python 的 operator
模組:
from operator import itemgetter
sample_dict = {'apple': 3, 'banana': 1, 'cherry': 2}
sorted_by_value = dict(sorted(sample_dict.items(), key=itemgetter(1)))
print(sorted_by_value)
結果:
{'banana': 1, 'cherry': 2, 'apple': 3}
程式碼說明:
itemgetter(1)
表示取得索引為 1 的元素(即值)。- 與
lambda
相比,效能稍好,適合處理大量資料。

3. ソート結果の再構築
對字典排序後,通常會得到一個由元組組成的列表。以下說明如何將其重新轉換為字典格式。
3.1 ソート済み辞書の作成
sorted_items = [('banana', 1), ('cherry', 2), ('apple', 3)]
reconstructed_dict = dict(sorted_items)
print(reconstructed_dict)
結果:
{'banana': 1, 'cherry': 2, 'apple': 3}
只要將元組列表傳入 dict()
函數,就能輕鬆地重新建立字典格式。
3.2 OrderedDict
の活用
從 Python 3.7 開始,一般的字典也會保留插入順序。不過,若你希望更明確地控制順序,可以使用 OrderedDict
。
from collections import OrderedDict
sample_dict = {'apple': 3, 'banana': 1, 'cherry': 2}
sorted_by_value = OrderedDict(sorted(sample_dict.items(), key=lambda x: x[1]))
print(sorted_by_value)
結果:
OrderedDict([('banana', 1), ('cherry', 2), ('apple', 3)])
當你需要處理順序很重要的資料時,這種方法會特別有幫助。
4. 応用例
接下來介紹一些關於 Python 字典排序的進階應用,包含如何排序字典列表,以及使用多條件排序的方法。
4.1 辞書のリストを特定のキーでソートする
在 Python 中,可以依據特定鍵來排序「字典的列表」。這在處理資料庫查詢結果或 JSON 資料時非常實用。
範例 1: 依照學生的年齡排序
students = [
{'name': 'Alice', 'age': 25},
{'name': 'Bob', 'age': 22},
{'name': 'Charlie', 'age': 23}
]
sorted_students = sorted(students, key=lambda x: x['age'])
print(sorted_students)
結果:
[{'name': 'Bob', 'age': 22}, {'name': 'Charlie', 'age': 23}, {'name': 'Alice', 'age': 25}]
程式碼說明:
- 透過
key=lambda x: x['age']
,以每位學生的年齡為排序依據。 sorted()
會回傳新的列表,原始資料不會被改動。
4.2 複数のキーでソートする
若要根據多個條件排序,可以使用元組作為排序依據。
範例 2: 依照姓名與年齡排序
students = [
{'name': 'Alice', 'age': 25},
{'name': 'Bob', 'age': 22},
{'name': 'Charlie', 'age': 23},
{'name': 'Alice', 'age': 20}
]
sorted_students = sorted(students, key=lambda x: (x['name'], x['age']))
print(sorted_students)
結果:
[{'name': 'Alice', 'age': 20}, {'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 22}, {'name': 'Charlie', 'age': 23}]
程式碼說明:
key=lambda x: (x['name'], x['age'])
會先根據姓名排序,再根據年齡排序。- 使用元組作為排序鍵,可輕鬆設定排序優先順序。
4.3 昇順・降順の指定
若要進行降序排序,只需在 sorted()
函數中加上 reverse=True
。
範例 3: 依年齡進行降序排序
students = [
{'name': 'Alice', 'age': 25},
{'name': 'Bob', 'age': 22},
{'name': 'Charlie', 'age': 23}
]
sorted_students = sorted(students, key=lambda x: x['age'], reverse=True)
print(sorted_students)
結果:
[{'name': 'Alice', 'age': 25}, {'name': 'Charlie', 'age': 23}, {'name': 'Bob', 'age': 22}]
4.4 ネストされた辞書のソート
即使字典內部還包含字典(巢狀結構),也能進行排序。
範例 4: 依照內部資料的 points 欄位排序
data = {
'team1': {'points': 50, 'rank': 2},
'team2': {'points': 40, 'rank': 3},
'team3': {'points': 60, 'rank': 1}
}
sorted_data = dict(sorted(data.items(), key=lambda x: x[1]['points']))
print(sorted_data)
結果:
{'team2': {'points': 40, 'rank': 3}, 'team1': {'points': 50, 'rank': 2}, 'team3': {'points': 60, 'rank': 1}}
程式碼說明:
x[1]['points']
用來從內層字典中取得 points 值作為排序依據。- 即使面對巢狀結構的資料,也能透過指定鍵來輕鬆排序。

5. 注意点とベストプラクティス
在對字典進行排序時,請注意以下幾個重點:
5.1 大規模データのパフォーマンス
由於字典排序會涉及列表操作,當處理大型資料集時,執行效率可能會成為瓶頸。
優化建議:
- 使用
operator.itemgetter
提升排序效率。 - 對排序結果進行快取,以避免重複處理相同資料。
5.2 Pythonのバージョンによる違い
從 Python 3.7 起,一般字典會自動保留插入順序;但在舊版本中,順序則不保證一致。
因應方式:
- 在較舊版本中,建議使用
OrderedDict
來維持順序。
6. まとめ
本文介紹了多種在 Python 中對字典(dict)進行排序的方法。內容涵蓋了基本的鍵與值排序技巧,也包括進階的應用情境,如排序字典列表、多重條件排序等。
重點回顧:
- 基本排序方法:
- 使用
sorted()
函數根據鍵或值進行排序。 - 透過
lambda
函數或operator.itemgetter
提高效率。
- 進階應用:
- 對字典列表進行排序,可根據單一或多個鍵。
- 巢狀字典也可依內部鍵排序。
- 注意事項:
- 處理大量資料時需考量效能問題。
- 了解不同 Python 版本的排序行為,必要時使用
OrderedDict
。
掌握 Python 字典排序技巧,對於資料整理與分析非常重要。希望本文能幫助你在實務開發中加以活用!
7. FAQ
Q1: 辞書を直接ソートすることはできますか?
A1: 雖然 Python 字典會保留順序,但無法直接排序。需使用 sorted()
函數,依鍵或值排序後再建立新的字典。
Q2: OrderedDict
と通常の辞書の違いは何ですか?
A2: 在 Python 3.7 之後,一般字典也會保留插入順序;但 OrderedDict
還支援順序變更與項目移動等進階功能。在 Python 3.6 以前的版本中,若需保留順序,OrderedDict
是必要的。
Q3: 辞書のキーや値が複雑なデータ型の場合、どのようにソートすればよいですか?
A3: 可以透過自訂排序鍵來解決。例如想依據字串長度或時間格式排序,可在 key
引數中使用 lambda
函數來指定條件。
範例:
data = {'a': [1, 2], 'b': [3], 'c': [1, 2, 3]}
sorted_data = dict(sorted(data.items(), key=lambda x: len(x[1])))
print(sorted_data)
結果:
{'b': [3], 'a': [1, 2], 'c': [1, 2, 3]}
Q4: ソートの結果を逆順にする方法は?
A4: 在 sorted()
函數中加入 reverse=True
參數,即可進行降序排序。
範例:
data = {'apple': 3, 'banana': 1, 'cherry': 2}
sorted_data = dict(sorted(data.items(), key=lambda x: x[1], reverse=True))
print(sorted_data)
結果:
{'apple': 3, 'cherry': 2, 'banana': 1}
Q5: ソート結果を元に戻すにはどうすればよいですか?
A5: 因為字典本身不保留原始順序,若要還原排序前的狀態,需搭配索引或列表來管理原始順序。或使用 OrderedDict
來保留與操作順序。
範例:
from collections import OrderedDict
data = {'apple': 3, 'banana': 1, 'cherry': 2}
ordered_data = OrderedDict(data)
print(ordered_data)