python标准库——collections模块 的defaultdict类
defaultdict类
在我们日常使用字典时,有时需要对字典的value赋予一个默认值,dict提供了一个setdefault方法可以实现,在python标准库中collections,也提供了一个defaultdict的类也实现了给字典赋予默认值的功能,而且在性能上比setdefault要快,我们直接看例子。
定义:在取defaultdict对象中不存在的key的值时,会给该key赋予一个default_factory返回值的默认值,并将该key和deault_factory返回值插入到defaultdict对象,deault_factory必须为一个工厂函数。
example1:
1 def dicdf(): 2 return(123) 3 dd2 = defaultdict(dicdf) 4 for i in 'abcdefjhijklmn': 5 dd2[i] 6 print(dd2) 7 8 dd3 = defaultdict(list) 9 for i in 'abcdefjhijklmn': 10 dd3[i] 11 print(dd3)
输出
defaultdict(<function dicdf at 0x00000000027BE730>, {'a': 123, 'b': 123, 'c': 123, 'd': 123, 'e': 123, 'f': 123, 'j': 123, 'h': 123, 'i': 123, 'k': 123, 'l': 123, 'm': 123, 'n': 123}) defaultdict(<class 'list'>, {'a': [], 'b': [], 'c': [], 'd': [], 'e': [], 'f': [], 'j': [], 'h': [], 'i': [], 'k': [], 'l': [], 'm': [], 'n': []})
example2:
from collections import defaultdict #dict d = {} for i in range(0,10): if i < 5: if 'k1' in d.keys(): d['k1'].append(i) else: d['k1'] = [i] else: if 'k2' in d.keys(): d['k2'].append(i) else: d['k2'] = [i] print(d) #setdefault d = {} d.setdefault('k1',[]) d.setdefault('k2',[]) for i in range(0,10): if i < 5: d['k1'].append(i) else: d['k2'].append(i) print(d) #defaultdict d1 = defaultdict(list) for i in range(0,10): if i < 5: d1['k1'].append(i) else: d1['k2'].append(i) print(d1)
上面是根据列表中元素的大小,分别添加到字典k1,k2的列表中。
第一种方法:
需要判断key是否存在,key的第一个值需要指定为list类型。
第二种方法:
给已知key添加的默认类型,但每个key都要添加一次。
第三种方法:给未知的key的value都添加为list,这种方法最快,在需要给所有key的value赋予默认值时,最快捷。
目前defaultdict主要用于给value默认值添加数据类型,需要注意的是,defaultdict的参数需要是一个default_factory,也就是我们所说的工厂函数。