collections.defaultdict()的使用

       这里的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
posted @ 2019-05-23 16:33  MKY-门可意  阅读(248)  评论(0编辑  收藏  举报