本文 AI 產出,尚未審核

Python 資料結構 – 字典(dict)

主題:keys(), values(), items()


簡介

在 Python 中,字典(dict) 是最常用的鍵值對(key‑value)資料結構。它提供了 O(1) 的查詢與更新效能,是處理映射關係、快取、設定檔等情境的首選。
keys()、values()、items() 三個方法則是取得字典內容的「入口」,讓我們能夠方便地遍歷、過濾或轉換資料。熟練這些方法,不僅能寫出更簡潔的程式碼,也能避免常見的效能與邏輯陷阱。

本篇文章將從概念說明、實作範例、常見問題與最佳實踐,完整介紹這三個方法的使用方式,並提供實務應用情境,幫助初學者快速上手,也讓已有基礎的開發者更深入理解。


核心概念

1. dict.keys() – 取得所有鍵

  • 回傳類型dict_keys(可視為一個可迭代的集合)
  • 特性:返回的物件是動態視圖,隨著原字典的變化而同步更新。
# 範例 1:基本用法
person = {"name": "Alice", "age": 28, "city": "Taipei"}
keys_view = person.keys()
print(keys_view)          # dict_keys(['name', 'age', 'city'])

# 轉成列表以便索引或切片
keys_list = list(keys_view)
print(keys_list[0])       # name

小技巧:如果只需要一次性使用,直接 list(d.keys());若要保留與字典的連動性,保留原始 dict_keys 物件。


2. dict.values() – 取得所有值

  • 回傳類型dict_values(同樣是動態視圖)
  • 注意:值可以重複,視圖不保證唯一性。
# 範例 2:取得所有值並做統計
scores = {"math": 85, "english": 92, "science": 78}
values_view = scores.values()
print(values_view)        # dict_values([85, 92, 78])

# 計算平均分
average = sum(values_view) / len(values_view)
print(f"平均分:{average:.1f}")   # 平均分:85.0

3. dict.items() – 同時取得鍵與值

  • 回傳類型dict_items(每個元素為 (key, value) 的 tuple)
  • 常見用途:在 for 迴圈中同時取得鍵和值,或在資料轉換時使用。
# 範例 3:遍歷字典並列印
inventory = {"apple": 10, "banana": 5, "orange": 8}
for fruit, qty in inventory.items():
    print(f"{fruit} 有 {qty} 個")
# 輸出:
# apple 有 10 個
# banana 有 5 個
# orange 有 8 個

4. 結合 zip()dict 產生新字典

有時候我們會分別取得鍵與值的視圖,想要重新組合成另一個字典:

# 範例 4:鍵和值分開取得後再組合
keys = ["id", "name", "email"]
values = [101, "Bob", "bob@example.com"]
new_dict = dict(zip(keys, values))
print(new_dict)
# {'id': 101, 'name': 'Bob', 'email': 'bob@example.com'}

5. 使用 dict comprehension 搭配 items()

# 範例 5:過濾出分數大於 80 的科目
scores = {"math": 85, "english": 92, "science": 78, "art": 88}
high_scores = {k: v for k, v in scores.items() if v > 80}
print(high_scores)
# {'math': 85, 'english': 92, 'art': 88}

常見陷阱與最佳實踐

陷阱 說明 改善方式
視圖變動 keys()/values()/items() 回傳的視圖會隨原字典變動,若在迭代期間修改字典會拋出 RuntimeError 在需要「快照」時,先 list(d.keys())list(d.values())list(d.items())
重複值的誤判 values() 可能包含重複值,若用 set(d.values()) 以為已去除重複,實際上會改變元素順序。 若需要保留順序且去重,可使用 dict.fromkeys(d.values()) 再取鍵。
效能誤區 大型字典在每次呼叫 keys()/values()/items() 時,都會產生視圖物件。雖然開銷小,但在極端迴圈中仍建議一次取得再重複使用。 把視圖存入變數,或一次性轉成列表/元組。
不必要的轉型 直接在 for k in d: 已等同於 for k in d.keys(),不需要額外呼叫 keys() 簡化程式碼,除非需要視圖的集合操作(如交集)才使用 keys()
字典鍵不可變 嘗試把字典的鍵改為可變物件(如 list)會拋 TypeError 確保鍵是不可變類型(str、int、tuple 等)。

最佳實踐

  1. 保持可讀性:在遍歷時使用 for key, value in d.items():,比 for key in d: value = d[key] 更直觀。
  2. 一次取得多個視圖:若同時需要鍵和值,直接使用 items(),避免多次呼叫 keys()values()
  3. 使用集合運算set(d.keys()) & set(other_dict.keys()) 可快速找出共同鍵。
  4. 避免在迭代中修改字典:如需刪除符合條件的項目,可先收集鍵再一次性刪除。
# 正確做法:先收集要刪除的鍵
to_remove = [k for k, v in data.items() if v < 0]
for k in to_remove:
    del data[k]

實際應用場景

  1. 資料清理與轉換

    • 從 CSV 讀入後的 dict,使用 items() 產生新字典,只保留必要欄位或改名。
  2. 快取(Cache)管理

    • 透過 keys() 取得所有快取鍵,搭配 random.choice(list(keys())) 隨機淘汰。
  3. API 回傳結果比對

    • 比對兩筆 API 回傳的 JSON 結構,使用 set(d1.keys()) ^ set(d2.keys()) 找出差異欄位。
  4. 統計分析

    • values() 結合 statistics 模組快速算出平均值、標準差等指標。
  5. 動態表格產生

    • items() 產生 HTML <table>,每列對應鍵值對,適合快速產生報表。
# 範例:產生簡易 HTML 表格
def dict_to_html(d):
    rows = "\n".join(f"<tr><td>{k}</td><td>{v}</td></tr>" for k, v in d.items())
    return f"<table>\n{rows}\n</table>"

html = dict_to_html({"Name": "Tom", "Score": 95, "Pass": True})
print(html)

總結

  • keys()、values()、items()字典操作的三大基石,提供了取得鍵、值、鍵值對的便利方式。
  • 這些方法回傳的「視圖」是動態的,了解其特性可以避免迭代期間的 RuntimeError,也能在需要快照時自行轉型。
  • 結合 集合運算、字典推導式、zip() 等技巧,能寫出簡潔且效能良好的程式碼。
  • 在實務上,無論是資料清理、快取管理、API 比對或報表產生,掌握這三個方法都能大幅提升開發效率與程式可讀性。

透過本文的概念說明與實作範例,希望你能在日常 Python 開發中,更自信且正確地使用 keys()values()items(),把字典這個強大的資料結構活用到各種情境。祝你寫程式快快樂樂,持續成長!