例一
給一家三明治店設計菜單,先確定大家喜歡吃哪些類型的面包。於是,我們定義這樣一個字典,把每種款式的名字和它當前的得票數關聯起來。
counters = {
'pumpernicker': 2,
'sourdough': 1
}
如果要記錄新的一票,首先判斷對應的鍵在不在字典中。如果不在就要把這個鍵添加到字典中,把票數默認置零,然后加上相應的票數。
方法一
使用 in 表達式判斷給定的鍵是否在字典中。
key = 'wheat'
if key in counters:
counters[key] += 1
else:
counters[key] = 1
方法二
利用KeyError異常
try:
counter[key] += 1
except KeyError:
counter[key] = 1
兩種方法的缺點:需要兩次訪問字典,當字典元素規模很大時,操作是費時的
方法三
Python內置的字典dict類型提供了get方法,可以通過第一個參數指定要查找的鍵,並通過第二個參數指定這個鍵不存在時應返回的默認值。這種方法只需要在查詢鍵值時訪問一次鍵名,然后做一次賦值操作
count = counters.get(key, 0)
counters[key] = count + 1
例二
如果字典里保存的值比較復雜,例如列表list。對例一的問題進一步擴展,這次不僅要記錄每種面包的得票數,還要記錄投票的人,我們只需對字典做如下改寫:
votes = {
'baguette': ['Bob', 'Alice'],
'ciabatta': ['Coco', 'Deb']
}
key = 'brioche'
who = 'Elmer'
if key in votes:
votes[key].append(who)
else:
votes[key] = [who]
類似,我們也可以用KeyError機制來改寫。
try:
votes[key].append(who)
except KeyError:
votes[key] = [who]
使用get方法
names = votes[key]
if names is None:
votes[key] = names = []
names.append(who)
dict提供了setdefault方法,這個方法會查詢字典里有沒有這個鍵,如果有,就返回對應的值,如果沒有,就先把用戶提供的默認值跟這個鍵關聯起來並插入字典,然后返回這個值。
names = votes.setdefault(key, [])
names.append(who)
defaultdict
defaultdict是Python內建dict類的一個子類,第一個參數為default_factory屬性提供初始值,默認為None。它覆蓋一個方法並添加一個可寫實例變量。它的其他功能與dict相同,但會為一個不存在的鍵提供默認值,從而避免KeyError異常。
如何使用defaultdict[1]
首先導入相應模塊:from collections import defaultdict。
defaultdict接受一個工廠函數作為參數,如下來構造:
my_dict = defaultdict(factory_function)
這個factory_function可以是list、set、str等等,作用是當key不存在時,返回的是工廠函數的默認值,比如list對應[ ],str對應的是空字符串,set對應set( ),int對應0,如下舉例:
例一
from collections import defaultdict
dict1 = defaultdict(int)
dict2 = defaultdict(set)
dict3 = defaultdict(str)
dict4 = defaultdict(list)
dict1[2] ='two'
print(dict1[1])
print(dict2[1])
print(dict3[1])
print(dict4[1])
輸出:
0
set()
[]
例二
from collections import defaultdict
s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
d = defaultdict(set)
for k, v in s:
d[k].add(v)
print(d)
輸出:
defaultdict(<class 'set'>, {'red': {1, 3}, 'blue': {2, 4}})