Python Dictionary 字典是以 Key-Value(鍵值對)為核心的資料結構,如同真實字典用單字查定義一般直覺。本文全攻略字典的建立、查詢、新增、修改與刪除,搭配 keys()、values()、items() 方法解析、常見錯誤防呆,以及巢狀字典與字典迭代的進階應用,讓你徹底掌握 Python Dict 操作精髓。
什麼是 Dictionary 字典?
Dictionary 字典是 Python 內建的鍵值對(Key-Value)映射資料結構,使用大括號 {} 建立。每個項目由唯一的 Key(鍵)對應一個 Value(值),取值時不需要知道索引位置,只要提供 Key 即可快速找到對應 Value。
與 List 最大的差異在於:List 靠索引(數字)找資料,Dict 靠鍵(Key)找資料。Dict 適合需要快速查找、標記資料的場景,例如商品價格表、使用者設定、股票代碼對應公司名稱等。
Python 3.7+ 之後,字典已保證插入順序,不再是完全無序。這讓字典在更多場景下可安全替代有序結構使用。
核心語法:建立與查詢
# === 建立字典:大括號 + 冒號 ===
# 格式:{Key: Value, Key: Value, ...}
price_lookup = {
'蘋果': 30,
'香蕉': 15,
'橘子': 25,
}
# 建立空字典
empty_dict = {}
# 也可用 dict() 建構函式
user = dict(name='小明', age=25, city='新竹')
print(user) # {'name': '小明', 'age': 25, 'city': '新竹'}
Key 必須是可雜湊(hashable)的型別,如字串、整數、Tuple;List 不可當 Key。Value 無限制,可以是任何型別。
# === 查詢:用 Key 取 Value ===
print(price_lookup['蘋果']) # 30,直接用 Key 存取
# 安全查詢:用 get() 避免 KeyError
print(price_lookup.get('西瓜')) # None(Key 不存在不報錯)
print(price_lookup.get('西瓜', '查無此品')) # 查無此品(提供預設值)
建議使用get(key, default)取代直接dict[key],當 Key 不存在時回傳預設值而非拋出 KeyError,讓程式更穩健。
# === 新增 / 修改 / 刪除 ===
stock = {'AAPL': 150.0}
# 新增:直接指派不存在的 Key
stock['TSLA'] = 250.0
print(stock) # {'AAPL': 150.0, 'TSLA': 250.0}
# 修改:對已存在的 Key 重新賦值
stock['AAPL'] = 175.5
print(stock['AAPL']) # 175.5
# 刪除:del 或 pop()
del stock['TSLA'] # 刪除 Key-Value,無回傳值
removed = stock.pop('AAPL') # 刪除並回傳 Value
print(removed) # 175.5
dict[key] = value 的行為是:Key 存在 → 修改 Value;Key 不存在 → 新增項目。一行搞定新增與修改兩種情境。
規則與注意事項
| 規則 | 正確範例 | 錯誤範例 |
|---|---|---|
| Key 必須唯一(重複時後者覆蓋前者) | {'a': 1, 'b': 2} |
{'a': 1, 'a': 2} → a 只剩 2 |
| Key 必須可雜湊 | {(1,2): 'tuple key'} |
{[1,2]: 'list key'} → TypeError |
| 直接存取不存在的 Key 會報錯 | d.get('不存在的Key', 預設值) |
d['不存在的Key'] → KeyError |
| for 迴圈預設迭代 Keys | for k in d:(得到 Keys) |
誤以為得到 Key-Value Tuple |
| 字典是可變(mutable)物件 | d['new'] = 99(可原地修改) |
不可直接用作另一個 Dict 的 Key |
常見錯誤與防呆
錯誤一:直接存取不存在的 Key 導致 KeyError
# ❌ 錯誤寫法(KeyError: '西瓜')
d = {'蘋果': 30}
print(d['西瓜'])
# ✅ 正確寫法:使用 get() 搭配預設值
print(d.get('西瓜', 0)) # 安全回傳 0
錯誤二:用 List 當 Key
# ❌ 錯誤寫法(TypeError: unhashable type: 'list')
d = {[1, 2]: 'value'}
# ✅ 正確寫法:改用 Tuple(不可變序列可雜湊)
d = {(1, 2): 'value'}
錯誤三:for 迴圈只拿到 Keys,誤以為是 Key-Value
# ❌ 誤解:以為同時拿到 key 和 value
d = {'a': 1, 'b': 2}
for item in d:
print(item) # 只印出 'a'、'b'(Keys)
# ✅ 正確寫法:用 .items() 同時取 key 和 value
for key, value in d.items():
print(f'{key} -> {value}') # a -> 1, b -> 2
進階用法
三大迭代方法:keys / values / items
字典提供三個視圖方法,分別回傳所有鍵、所有值、或所有鍵值對,適合不同迭代需求。
portfolio = {'AAPL': 175.5, 'TSLA': 250.0, 'GOOGL': 140.3}
# 只迭代 Keys
for ticker in portfolio.keys():
print(ticker) # AAPL, TSLA, GOOGL
# 只迭代 Values
for price in portfolio.values():
print(price) # 175.5, 250.0, 140.3
# 同時迭代 Key 和 Value(最常用)
for ticker, price in portfolio.items():
print(f'{ticker}:{price} 元')
巢狀字典:字典中的字典
Value 可以是另一個字典,形成巢狀結構,非常適合表達結構化資料,如使用者資料、API 回應或設定檔。
# 巢狀字典:每個用戶有多筆屬性
users = {
'alice': {'age': 30, 'city': '台北', 'score': 95},
'bob': {'age': 25, 'city': '新竹', 'score': 87},
}
# 取出 alice 的 city
print(users['alice']['city']) # 台北
# 修改 bob 的 score
users['bob']['score'] = 90
print(users['bob']) # {'age': 25, 'city': '新竹', 'score': 90}
update() 合併字典與批量更新
update() 可一次將另一個字典的所有鍵值對合併進來,Key 重複時以新值覆蓋,常用於設定更新或資料合併。
# 量化交易參數設定:預設值 + 自訂覆蓋
default_config = {'lot': 0.1, 'sl': 50, 'tp': 100, 'magic': 12345}
custom_config = {'sl': 30, 'tp': 150}
default_config.update(custom_config) # 只更新指定的 Key
print(default_config)
# {'lot': 0.1, 'sl': 30, 'tp': 150, 'magic': 12345}
煉金坊小叮嚀
字典是我在量化交易開發中最常用的資料結構之一!每次存放 EA 參數設定、解析 JSON 行情資料,都離不開 Dict。最重要的心法只有一句:永遠用 get() 取值,不要裸用 dict[key],這樣程式在 Key 不存在時不會崩潰。另外,.items() 是迭代字典的標準姿勢,比用 .keys() 再查值更簡潔。掌握字典,就掌握了 Python 資料流的核心——JSON 解析、API 對接、設定管理,全都建立在這個基礎上。