最近閱讀 Python Cookbook 錦囊妙計,發現有很多非常有用的方法能讓 python code 變得非常簡潔優雅,分享一下一些使用的情境與使用方法。

欲解決的問題:

想要製作一個 dictionary 它會將各個 keys 對應到一個以上的值。

解決方法:

遇到這個問題,一般初學者直覺的想法,可能會製作一個類似這樣的一個 dictionary

defaultdict1.py
1
2
3
4
5
d = {
'John':[5, 10, 15, 20],
'Henry':[4, 8, 12, 16, 20],
'Cindy':[10, 20]
}

因為我們需要更靈活的運用 dictionary 不單單只是把 dictionary 初始化放在那裡,我們可能需要動態地增加資料進去 list 稍微資深一點可能就會考慮使用 setdefault 像以下這種做法

defaultdict2.py
1
2
3
4
5
6
7
d = {}
d.setdefault('John', []).append(25)
d.setdefault('John', []).append(30)

d.setdefault('Henry', []).append(24)

d.setdefault('Cindy', []).append(30)

然而, setdefault 運用起來並沒有沒那麼直覺,每次建立時總是會初始化一個 instance 例如範例的 []

這裏提供了一個更為簡潔的方法能夠輕鬆的地構建這種 dictionary 透過使用 collections 模組中的 defaultdict

defaultdict2.py
1
2
3
4
5
6
7
8
9
from collections import defaultdict

d = defaultdict(list)
d['John'].append(60)
d['John'].append(55)

d['Henry'].append(32)

d['Cindy'].append(40)

這樣一來看起來輕鬆許多, collections.defaultdict 會自動為之後被存取的 key 建立 dictionary entries 即便目前在字典中找不到它們也是一樣。