zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    2017 湖南省赛 K Football Training Camp
    一些相似单词的区别之处
    LeetCode301. Remove Invalid Parentheses
    算法刷题细节点总结
    LeetCode765. Couples Holding Hands
    LeetCode741. Cherry Pickup
    LeetCode312. Burst Balloons
    LeetCode679. 24 Game
    LeetCode862. Shortest Subarray with Sum at Least K
    LeetCode818. Race Car
  • 原文地址:https://www.cnblogs.com/menkeyi/p/10912732.html
Copyright © 2011-2022 走看看