本文 AI 產出,尚未審核
Python 資料結構 – 字典(dict)
建立、取值、刪除
簡介
在 Python 中,字典(dict) 是最常用的可變容器之一。它以「鍵‑值」的形式儲存資料,提供 O(1) 的查詢與更新效能,適合用來做快速的資料對應、設定管理、統計計算等工作。無論是處理 API 回傳的 JSON、建立映射表,或是實作簡易的快取機制,字典都是不可或缺的工具。
本篇文章聚焦於 字典的三大基本操作:建立、取值、刪除。透過淺顯易懂的說明與實用範例,讓剛踏入 Python 的新手能快速上手,同時提供中級開發者在實務專案中提升程式碼品質的技巧。
核心概念
1. 建立字典
字典可以用多種方式產生,最常見的是使用大括號 {} 或 dict() 建構子。
# 方式一:直接使用大括號,鍵值對以冒號分隔,項目之間以逗號分隔
person = {
"name": "Alice",
"age": 28,
"city": "Taipei"
}
print(person) # {'name': 'Alice', 'age': 28, 'city': 'Taipei'}
# 方式二:使用 dict(),適合鍵是合法的變數名稱時
config = dict(host="localhost", port=3306, debug=True)
print(config) # {'host': 'localhost', 'port': 3306, 'debug': True}
# 方式三:從可迭代的 (key, value) 兩元組建立
pairs = [("apple", 3), ("banana", 5), ("orange", 2)]
fruit_qty = dict(pairs)
print(fruit_qty) # {'apple': 3, 'banana': 5, 'orange': 2}
小技巧:若鍵是字串且符合變數命名規則,使用
dict()可寫得更簡潔;若鍵包含空格或特殊字元,仍需使用大括號。
2. 取值(存取資料)
2.1 直接索引
# 直接使用鍵取得值,若鍵不存在會拋出 KeyError
age = person["age"]
print(age) # 28
2.2 get() 方法
# 使用 get() 可提供預設值,避免例外
salary = person.get("salary", 0) # 若不存在回傳 0
print(salary) # 0
2.3 檢查鍵是否存在
if "city" in person:
print("城市資訊:", person["city"])
else:
print("沒有城市資訊")
2.4 取得所有鍵、值或鍵值對
keys = person.keys() # dict_keys(['name', 'age', 'city'])
values = person.values() # dict_values(['Alice', 28, 'Taipei'])
items = person.items() # dict_items([('name', 'Alice'), ('age', 28), ('city', 'Taipei')])
for k, v in items:
print(f"{k} => {v}")
3. 刪除元素
3.1 del 關鍵字
# 刪除特定鍵值對,若鍵不存在會拋出 KeyError
del person["city"]
print(person) # {'name': 'Alice', 'age': 28}
3.2 pop() 方法
# pop() 會回傳被刪除的值,且允許設定預設值
removed_age = person.pop("age")
print(removed_age) # 28
print(person) # {'name': 'Alice'}
# 若鍵不存在且未提供預設值,仍會拋出 KeyError
# person.pop("gender") # KeyError
3.3 popitem() 方法
# popitem() 會隨機(Python 3.7+ 為 LIFO)移除最後加入的鍵值對
fruit_qty["grape"] = 7
last_item = fruit_qty.popitem()
print(last_item) # ('grape', 7)
print(fruit_qty) # {'apple': 3, 'banana': 5, 'orange': 2}
3.4 清空整個字典
person.clear()
print(person) # {}
常見陷阱與最佳實踐
| 陷阱 | 說明 | 建議的寫法 |
|---|---|---|
| KeyError | 直接使用 dict[key] 時,如果鍵不存在會拋出例外。 |
使用 dict.get(key, default) 或先檢查 if key in dict。 |
| 可變物件作為鍵 | 只能使用 不可變(hashable)物件作為鍵,如字串、數字、tuple。 | 切勿把 list、dict 本身作為鍵;若需要複雜鍵,可使用 frozenset 或自訂的 __hash__。 |
| 共享同一個預設字典 | 使用 dict.setdefault() 時,若預設值是可變物件,所有鍵會共享同一個實例。 |
使用 defaultdict(collections 模組)或在 setdefault 中傳入 copy.deepcopy。 |
| 迭代時同時修改字典 | 在遍歷 dict 時直接刪除或新增鍵會拋出 RuntimeError。 |
先把鍵列成清單 for k in list(d): 再操作,或使用 dict comprehension。 |
| 字典順序的誤解 | Python 3.6 之後字典保持插入順序,但仍不保證排序。 | 若需要排序結果,使用 sorted(d.items()) 或 collections.OrderedDict。 |
最佳實踐:
- 使用
dict.get()取代直接索引,提升容錯性。 - Prefer
defaultdict當需要自動建立預設容器(list、set 等)。 - 避免在迭代時改變字典,改用
list(d)或dict.copy()。 - 保持鍵的不可變性,確保字典的雜湊穩定。
- 寫測試:對於關鍵的查詢或刪除邏輯,加入單元測試以防止
KeyError或資料遺失。
實際應用場景
API 回傳資料的解析
import json, requests resp = requests.get("https://api.example.com/user/123") data = resp.json() # data 為 dict username = data.get("username") # 安全取得設定檔管理
# config.yaml 轉成 dict import yaml with open("config.yaml") as f: cfg = yaml.safe_load(f) # 取得設定,若未設定使用預設值 log_level = cfg.get("log_level", "INFO")統計字詞出現次數
from collections import defaultdict text = "Python 是一門易學且功能強大的程式語言".split() counter = defaultdict(int) for word in text: counter[word] += 1 print(counter) # defaultdict(<class 'int'>, {'Python': 1, '是': 1, ...})快取(Cache)實作
cache = {} def get_user(id): if id in cache: return cache[id] # 直接回傳快取 # 否則從資料庫取得 user = query_db(id) cache[id] = user return user資料關聯映射
# 商品編號 ↔ 商品資訊 products = { 101: {"name": "筆記型電腦", "price": 35000}, 102: {"name": "手機", "price": 12000}, } pid = 101 print(f"商品名稱: {products[pid]['name']}, 價格: {products[pid]['price']}")
總結
字典是 Python 中最核心、最彈性的資料結構之一。透過 建立、取值、刪除 這三個基本操作,我們可以快速完成資料的映射、設定管理與即時查詢。掌握了 dict 的正確使用方式,並留意常見的陷阱與最佳實踐,能讓程式碼更安全、效能更佳,也為日後處理更複雜的資料結構奠定堅實基礎。
實務建議:在新專案中,先規劃好字典的鍵與值的類型,盡量使用不可變鍵,並透過
get()、defaultdict或setdefault來避免不必要的KeyError。在需要保持順序或排序的情況下,考慮使用OrderedDict或在取值後自行排序。
祝你在 Python 的世界裡玩得開心,將字典運用得爐火純青! 🚀