这里的defaultdict(function_factory)构建的是一个类似dictionary的对象,其中keys的值,自行确定赋值,但是values的类型,是function_factory的类实例,而且具有默认值。
使用list作第一个参数,可以很容易将键-值对序列转换为列表字典。
1 import collections 2 s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] 3 4 d = collections.defaultdict(list) 5 for k, v in s: 6 d[k].append(v)#这里的结构是k:[] 所以这里可以append 7 8 9 print(d.items()) 10 11 print(d["aaa"]) #获取不存在的key并不会报错
输出:
dict_items([('yellow', [1, 3]), ('blue', [2, 4]), ('red', [1])]) []
dict_items 统计”yellow” 的所有v的值, d[“aaa”] 没有此key返回空列表
字典也有类似功能:
1 s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] 2 d={} 3 for k, v in s: 4 d.setdefault(k,[]).append(v) 5 6 print(d.items())
这个方法便捷性差一些 dict.setdefault()
defaultdict计数,将default_factory设为int即可
1 from collections import defaultdict 2 s = 'mississippiasdjklajskdlzxzxcmasdasdzxc' 3 d = defaultdict(int) 4 5 for k in s: 6 d[k] += 1 7 8 print(d.items())
结果:
dict_items([('m', 2), ('i', 4), ('s', 8), ('p', 2), ('a', 4), ('d', 4), ('j', 2), ('k', 2), ('l', 2), ('z', 3), ('x', 3), ('c', 2)])
字符串中的字母第一次出现时,字典中没有该字母,default_factory函数调用int()为其提供一个默认值0,加法操作将计算出每个字母出现的次数。
使用函数返回
此函数不能带参数
1 from collections import defaultdict 2 def constant_factory(value): 3 return lambda: 0 4 d = defaultdict(constant_factory(s)) 5 6 print(d["aaa"])
0
使用lambda来完成统计
1 from collections import defaultdict 2 s = 'mississippiasdjklajskdlzxzxcmasdasdzxc' 4 counter = defaultdict(lambda: 0) 5 for kw in s: 6 counter[kw] += 1