例一
给一家三明治店设计菜单,先确定大家喜欢吃哪些类型的面包。于是,我们定义这样一个字典,把每种款式的名字和它当前的得票数关联起来。
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}})