本文 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 等)。 |
最佳實踐:
- 保持可讀性:在遍歷時使用
for key, value in d.items():,比for key in d: value = d[key]更直觀。 - 一次取得多個視圖:若同時需要鍵和值,直接使用
items(),避免多次呼叫keys()與values()。 - 使用集合運算:
set(d.keys()) & set(other_dict.keys())可快速找出共同鍵。 - 避免在迭代中修改字典:如需刪除符合條件的項目,可先收集鍵再一次性刪除。
# 正確做法:先收集要刪除的鍵
to_remove = [k for k, v in data.items() if v < 0]
for k in to_remove:
del data[k]
實際應用場景
資料清理與轉換
- 從 CSV 讀入後的
dict,使用items()產生新字典,只保留必要欄位或改名。
- 從 CSV 讀入後的
快取(Cache)管理
- 透過
keys()取得所有快取鍵,搭配random.choice(list(keys()))隨機淘汰。
- 透過
API 回傳結果比對
- 比對兩筆 API 回傳的 JSON 結構,使用
set(d1.keys()) ^ set(d2.keys())找出差異欄位。
- 比對兩筆 API 回傳的 JSON 結構,使用
統計分析
values()結合statistics模組快速算出平均值、標準差等指標。
動態表格產生
- 用
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(),把字典這個強大的資料結構活用到各種情境。祝你寫程式快快樂樂,持續成長!