字典 是 Python 核心資料結構:可變、無序 (Py3.7+ 保留插入序)、鍵值對映射。別名關聯陣列、雜湊表。本文系統整理建立、存取、修改、刪除、鍵限制與最佳實踐。
建立字典
# 字面語法
d1 = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
# dict() 建構子
d2 = dict(abc=456) # 關鍵字引數 (鍵必須合法識別字)
d3 = dict([('a', 1), ('b', 2)]) # 可迭代鍵值對
d4 = dict.fromkeys(['a', 'b', 'c'], 0) # 統一預設值
# 空字典
empty = {}
empty2 = dict()
存取值
d = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
print(d['Name']) # 'Zara' (不存在拋 KeyError)
print(d.get('Name')) # 'Zara'
print(d.get('Missing')) # None
print(d.get('Missing', 'N/A')) # 'N/A' (預設值)
# in 檢查存在性
print('Name' in d) # True
print('Alice' in d) # False
更新與新增
d = {'Name': 'Zara', 'Age': 7}
d['Age'] = 8 # 修改現有
d['School'] = 'DPS' # 新增
d.update({'Age': 9, 'City': 'Taipei'}) # 批次更新
print(d) # {'Name': 'Zara', 'Age': 9, 'School': 'DPS', 'City': 'Taipei'}
刪除操作
d = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
del d['Name'] # 刪除指定鍵 (不存在拋 KeyError)
popped = d.pop('Age') # 刪除並回傳值
# d.pop('Missing', 'default') # 不存在回傳預設值
d.clear() # 清空所有項目
# del d # 刪除變數綁定
鍵的特性與限制
| 規則 | 說明 | 範例 |
| 唯一性 | 重複鍵後勝 | {'a':1, 'a':2} -> {'a':2} |
| 可雜湊性 | 鍵必須 immutable | str、int、tuple(元素皆 immutable) ✓ / list、dict、set ✗ |
| 值無限制 | 可為任意物件 | 包含 list、dict、函數、類別 |
# 合法鍵
d = {(1, 2): 'tuple key', 3.14: 'float key', True: 'bool key'}
# 非法鍵
# d = {[1,2]: 'list key'} # TypeError: unhashable type: 'list'
# d = {{'a':1}: 'dict key'} # TypeError
核心方法速查表
| 方法 | 功能 | 回傳值 |
keys() | 所有鍵視圖 | dict_keys (可迭代、動態) |
values() | 所有值視圖 | dict_values |
items() | 所有鍵值對視圖 | dict_items (可迭代、動態) |
get(k, default) | 安全取值 | 值或 default |
setdefault(k, default) | 不存在則設定並回傳 | 值 |
pop(k, default) | 刪除並回傳 | 值或 default |
popitem() | 刪除並回傳任一項 (LIFO) | (k, v) |
update(other) | 批次合併 | None |
copy() | 淺拷貝 | 新字典 |
fromkeys(seq, val) | 類別方法建立 | 新字典 |
遍歷模式
d = {'a': 1, 'b': 2}
# 僅鍵
for k in d:
print(k)
# 鍵值對 (推薦)
for k, v in d.items():
print(k, v)
# 僅值
for v in d.values():
print(v)
# 列表化 (需靜態快照)
keys = list(d.keys())
常見陷阱
# 1. 迴圈中修改字典大小
d = {'a': 1, 'b': 2}
for k in d:
if k == 'a':
del d[k] # RuntimeError: dictionary changed size during iteration
# 解法:遍歷副本
for k in list(d.keys()):
if k == 'a':
del d[k]
# 2. 可變預設值陷阱
def add_item(item, shopping_list=[]):
shopping_list.append(item)
return shopping_list
print(add_item('apple')) # ['apple']
print(add_item('banana')) # ['apple', 'banana'] 共享同一列表!
# 正確:
def add_item(item, shopping_list=None):
if shopping_list is None:
shopping_list = []
shopping_list.append(item)
return shopping_list
# 3. 深拷貝需求
import copy
d = {'a': [1,2]}
d2 = d.copy() # 淺拷貝
d2['a'].append(3)
print(d['a']) # [1, 2, 3] 受影響!
d3 = copy.deepcopy(d) # 深拷貝
Python 3.7+ 插入序保證
CPython 3.6 實作細節,3.7 正式規範:字典保留插入順序。keys()/values()/items() 依插入序產出。但不要依賴此特性做排序,需排序請用 sorted(d.items())。
字典是 Python 最高效的查找表,掌握其 API 與陷阱,能寫出簡潔高效的資料處理程式碼。
- 上一篇文章: Python 字串包含字元集合檢測:any/all、itertools、set 運算三種模式效能與語意對比
- 下一篇文章: Python type() 函數詳解:型別檢查、動態建立類別、單例模式與元類編程基礎
Copyright ©
程式碼之家 All Rights Reserved