一、defaultdict产生的原因:
当我使用普通的字典时,用法一般是dict={},添加元素的只需要dict[element] =value即,调用的时候也是如此,dict[element] = xxx,但前提是element字典里,如果不在字典里就会报错。
defaultdict的作用是在于,当字典里的key不存在但被查找时,返回的不是keyError而是一个默认值。
二、defaultdict函数:
函数:dict =defaultdict( factory_function)
1、常规用法:
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]) # 0
print(dict2[1]) # set()
print(dict3[1]) #
print(dict4[1]) # []
2、自定义类型:
factory_function如果传入的是类对象,那么默认值会调用类的构造函数并返回对应实例;如果是函数,则直接调用函数,并将函数返回值作为默认值。
例如:
from collections import defaultdictclass Cls:def __init__(self, val='hello'):self.val = valdef __str__(self):return self.valdef fun(val=121):return valdic_1 = defaultdict(Cls)
dic_2 = defaultdict(fun)print(dic_1['a']) # hello
print(dic_2['a']) # 121
3、重复调用问题:
当我们多次取不存在的相同key对应的默认值时,但它只会调用了一次取默认值函数。
例如:
from collections import defaultdictdef fun(val=121):print('创建了默认值')return valdic = defaultdict(fun)
for i in range(1000):dic['a'] dic['b']
输出:
创建了默认值
创建了默认值
注意事项:只调用了一次dic['a'],调用一次dic['b'];
4、返回的默认值问题:
当key相同时返回的默认值是同一个对象;
当key不同时返回的默认值不是同一个对象;
例如:
from collections import defaultdictclass Cls:def __init__(self, val='hello'):self.val = valdef __str__(self):return self.valdic = defaultdict(Cls) print(dic['a']== dic['a']) # True
print(dic['a']== dic['b']) # False