使用鍵與數值排序 Python 字典(dict)的方法|從基礎到進階全面解析

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}

程式碼說明:

  1. sample_dict.items() 會以鍵值對的形式取得字典的項目。
  2. sorted() 函數根據鍵(x[0])進行排序。
  3. 最後使用 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}

程式碼說明:

  1. 使用 key=lambda x: x[1] 來指定排序依據為「值」。
  2. 會依照數值由小到大排序,適合用於排行榜或數值比較等情境。

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}

程式碼說明:

  1. itemgetter(1) 表示取得索引為 1 的元素(即值)。
  2. 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}]

程式碼說明:

  1. 透過 key=lambda x: x['age'],以每位學生的年齡為排序依據。
  2. 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}]

程式碼說明:

  1. key=lambda x: (x['name'], x['age']) 會先根據姓名排序,再根據年齡排序。
  2. 使用元組作為排序鍵,可輕鬆設定排序優先順序。

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}}

程式碼說明:

  1. x[1]['points'] 用來從內層字典中取得 points 值作為排序依據。
  2. 即使面對巢狀結構的資料,也能透過指定鍵來輕鬆排序。
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

5. 注意点とベストプラクティス

在對字典進行排序時,請注意以下幾個重點:

5.1 大規模データのパフォーマンス

由於字典排序會涉及列表操作,當處理大型資料集時,執行效率可能會成為瓶頸。

優化建議:

  • 使用 operator.itemgetter 提升排序效率。
  • 對排序結果進行快取,以避免重複處理相同資料。

5.2 Pythonのバージョンによる違い

從 Python 3.7 起,一般字典會自動保留插入順序;但在舊版本中,順序則不保證一致。

因應方式:

  • 在較舊版本中,建議使用 OrderedDict 來維持順序。

6. まとめ

本文介紹了多種在 Python 中對字典(dict)進行排序的方法。內容涵蓋了基本的鍵與值排序技巧,也包括進階的應用情境,如排序字典列表、多重條件排序等。

重點回顧:

  1. 基本排序方法:
  • 使用 sorted() 函數根據鍵或值進行排序。
  • 透過 lambda 函數或 operator.itemgetter 提高效率。
  1. 進階應用:
  • 對字典列表進行排序,可根據單一或多個鍵。
  • 巢狀字典也可依內部鍵排序。
  1. 注意事項:
  • 處理大量資料時需考量效能問題。
  • 了解不同 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)

 

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール