Python Dictionary 字典:Key-Value 建立與查詢操作

Python Dictionary 字典是以 Key-Value(鍵值對)為核心的資料結構,如同真實字典用單字查定義一般直覺。本文全攻略字典的建立、查詢、新增、修改與刪除,搭配 keys()values()items() 方法解析、常見錯誤防呆,以及巢狀字典與字典迭代的進階應用,讓你徹底掌握 Python Dict 操作精髓。

Cinematic visualization of a Python dictionary as a glowing lookup table with key-value pairs floating in deep space, amber keys connecting to cyan values with luminous connectors, dark industrial backdrop, cinematic lighting, deep shadows, 16:9

什麼是 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 對接、設定管理,全都建立在這個基礎上。

張貼留言

較新的 較舊