方法簽名
dict.setdefault(key, default=None)
行為說明
- 若
key 存在 → 回傳對應值,**不修改** 字典
- 若
key 不存在 → 插入 key: default,回傳 default
- 相當於:
if key not in d: d[key] = default; return d[key]
基本範例
d = {'name': 'Alice', 'age': 25}
print(d.setdefault('age', 0)) # 25 (鍵存在,回傳既有值)
print(d.setdefault('city', 'Taipei')) # Taipei (鍵不存在,插入並回傳)
print(d) # {'name': 'Alice', 'age': 25, 'city': 'Taipei'}
經典用法:分組統計
words = ['apple', 'banana', 'apricot', 'blueberry', 'cherry']
groups = {}
for w in words:
key = w[0] # 首字母分組
groups.setdefault(key, []).append(w)
print(groups)
# {'a': ['apple', 'apricot'], 'b': ['banana', 'blueberry'], 'c': ['cherry']}
進階:巢狀字典自動建立
# 多層 setdefault
data = {}
data.setdefault('2024', {}).setdefault('Q1', []).append(100)
data.setdefault('2024', {}).setdefault('Q1', []).append(200)
# data = {'2024': {'Q1': [100, 200]}}
# 更優雅:collections.defaultdict
from collections import defaultdict
dd = defaultdict(lambda: defaultdict(list))
dd['2024']['Q1'].append(100)
比較:get() vs setdefault() vs []
| 操作 | 鍵存在 | 鍵不存在 | 修改字典 |
d[key] | 回傳值 | 拋出 KeyError | 否 |
d.get(key, def) | 回傳值 | 回傳 def | 否 |
d.setdefault(key, def) | 回傳值 | 插入並回傳 def | 是 |
注意事項
default 參數會被**直接插入**,若為可變物件(列表、字典),所有缺鍵插入共用同一物件實例 → 使用 defaultdict 或 lambda 延遲建立
- 執行緒不安全,多執行緒需自行加鎖