常常忘記要檢查
每次取用前得先用 setdefault() 確認,不夠直覺,容易忘記。# setdefault with int()
d = dict()
for c in 'Apple':
d.setdefault(c, 0)
d[c] += 1
print(d) # {'A': 1, 'p': 2, 'l': 1, 'e': 1}
可能沒必要的呼叫
就算 key 已經存在,還是會執行一次 [] 產生一個空的 list,效能浪費了。# setdefault with list()
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = dict()
for k, v in s:
d.setdefault(k, []).append(v)
print(sorted(d.items())) # [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
defaultdict 來簡化
用 defaultdict 來簡化使用的過程,只要在建立 dict 時(事實上是 defaultdict)傳入 key 不存在時,用來建立 key 對應的 value 的函式即可。defaultdict() 回傳的是 dict 的 subclass,擁有 dict 所有的功能。
# defaultdict with int()
from collections import defaultdict
d = defaultdict(int) # 表示 int(),傳入函式名稱,並未呼叫執行
for c in 'Apple':
d[c] += 1 # 一旦遇到 key 不存在時,就會呼叫 int() 產生預設值並存入 dict 中
print(d) # defaultdict(<class 'int'>, {'A': 1, 'p': 2, 'l': 1, 'e': 1})
defaultdict 來救效能
只有 key 不存在時才會呼叫 list()。# defaultdict with list()
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
from collections import defaultdict
d = defaultdict(list) # 表示 list(),傳入函式名稱,並未呼叫執行
for k, v in s:
d[k].append(v)
print(sorted(d.items())) # [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
dict of sets 也是常用的功能。# defaultdict with set()
s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
from collections import defaultdict
d = defaultdict(set)
for k, v in s:
d[k].add(v)
print(sorted(d.items())) # [('blue', {2, 4}), ('red', {1, 3})]
官方文件
---
---
---
沒有留言:
張貼留言