一、為什么把字典和集合放同一篇?
? 底層都是哈希表,API 設計高度對稱。
? 日常任務無非「讀-寫-去重-集合運算」,這 5 個方法就能打穿。
二、三件套 & 二板斧一覽
名稱 | 作用 | 返回值 | 原地? |
---|---|---|---|
dict.get(key, default) | 安全讀取 | 值或 default | ? |
dict.setdefault(k, v) | 讀不到就寫入 | 值(新或舊) | ? |
dict.items() | 同時遍歷 k-v | 可迭代視圖 | ? |
set.add(elem) | 把元素扔進去 | None | ? |
set.union(other) | 合并兩個集合 | 新集合 | ? |
三、一行代碼場景秀
- 統計詞頻,一行搞定缺省值
freq = {}
for w in words:freq[w] = freq.get(w, 0) + 1 # 或 freq.setdefault(w, 0)
- 構造「默認值是列表」的分組字典
groups = {}
for tag, obj in items:groups.setdefault(tag, []).append(obj)
- 同時遍歷鍵值,不再手寫
for k in d:
for k, v in user.items():print(k, v.upper())
- 去重并保持插入順序(3.7+ 字典有序)
unique = list(dict.fromkeys(seq))
- 合并兩個標簽集合
all_tags = tag_set_a.union(tag_set_b) # 或 tag_set_a | tag_set_b
- 實時黑名單過濾
blocked = {'spam', 'ad'}
msg = [w for w in tokens if w not in blocked]
四、mini 實戰:5 行代碼實現「購物車合并」
需求:把多份購物車 dict 合并,同商品數量相加。
from collections import Counter
cart1 = {'apple': 3, 'banana': 1}
cart2 = {'apple': 2, 'pear': 5}merged = Counter(cart1)
for k, v in cart2.items():merged[k] = merged.get(k, 0) + vprint(dict(merged)) # {'apple': 5, 'banana': 1, 'pear': 5}
核心動作拆解:
? items()
遍歷鍵值
? get()
安全讀取舊值
? 結果轉回普通 dict(如需 JSON 序列化)
五、記憶口令
“字典三件套:get 讀,setdefault 寫,items 走; 集合兩把刀:add 去重,union 合。”