defaultdict详解【实现、高级应用、示例展示】

defaultdict作用简化手动向dict中添加值判断过程,例如我们想构建一个值为list的dict – Dict[List],defaultdict取值判断key是否存在,如果不存在则向defaultdict添加key及我们添加可调用对象的返回值添加到字典中
示例如下:

# 传统方法:
dic = {}
if 'a' not in dic:
    dic['a'] = []
dic['a'].append(10)

# 使用defaultdict简化
dic = defautdict(list)
dic['a'].append(10)  # 自动添加'a'键且值为list(),之后返回该list()对象,然后我们就可以直接用list方法操作

1. 简介:

defaultdict是内置dict类的子类,它相对于dict有两个变化:

  • 构造函数[ __init__(self) ]中添加了一个变量【default_factory - 该参数默认值None,接受None或者callable对象 [ 可调用对象, 调用后返回值作为不存在key的value值 ] 值,default_factory 为__init__函数的第一个参,之后的可变位置参数和关键字参数和dict相同default_factory =None时等同于内置dict类

    >>> # dict中参数 可迭代两元素对象,或者键值对,或者两者同时存在,如下:
    >>> dic = defaultdict(int, [(1, 10), ('a', 22)], b='b')
    >>> dic
    defaultdict(<class 'int'>, {1: 10, 'a': 22, 'b': 'b'})
    >>> dic['10']
    0
    >>> # 下面为default_factory =None时情况,此时等同于内置dict
    >>> dic = defaultdict(None)
    >>> dic[10]
    Traceback (most recent call last):
    File "<pyshell#6>", line 1, in <module>
      dic1[10]
    KeyError: 10
    
  • 重写了dict的__missing__(key)方法,当通过中括号方式【底层调用__getitem__方法获取值】获取defaultdict实例中不存在的键的值时__getitem__方法会进一步调用__missing__方法,然后__missing__会调用default_factory,如果None时raise KeyError,如果可调用对象时调用该对象,返回值作为键的值添加到defaultdict中,且返回value值

    • 1)该方法只会被__getitem__()方法调用

    使用中括号取值时调用的方法, 代码如下:

    >>> dic = dict()
    >>> dic['a']  # 此时真正调用的是__getitem__(self, key)方法
    >>>
    >>> # 下面为get方法介绍:
    >>> dic = defaultdict(int, [(1, 10), ('a', 22)], b='b')
    >>> dic['10']
    0
    >>> dic.get('10')  # 返回None
    >>> dic.get('10', '使用和dict中get相同')  # 返回 `使用和dict中get相同` 字符串
    '使用和dict中get相同'
    >>> 
    
    • 2)基于1)介绍可知当通过get等方法获取defaultdict中不存在键的值时,不会调用__missing__方法,get采用和内置类dict相同的操作,返回值后get中default参数决定

2. 详解:

defaultdict第一个参数可接受的值:

  • 一、None - 等同于内置dict
  • 二、任何可调用的对象
    • ① 常用内置数据类型对象:int, str, float, bool, 他们对应的默认值 int() == 0, str() ==’’, float()==0.0, bool() is False
      在这里插入图片描述
    • ② 常用内置数据结构对象:list, set, dict 等等,分别设置默认值 list(), set(), dict()
    • ③ 自定义对象【函数、类实例、类都可以,只需要保证可调用且不接收参数即可】
    class T: 
        pass
    dic = defaultdict(T)
    dic[10]   # 设置默认值 T() 对象
    # dic对象:  defaultdict(<class '__main__.T'>, {10: <__main__.T object at 0x000001E22ED5EE88>})
    
    class Demo:
        def __call__(self):
            return 10
    dic = defaultdict(T())
    dic[10]
    # 设置不存在键的值为__call__函数返回值
    

在这里插入图片描述

  • 基于上一条设置任意常量值方法,添加一个函数等返回固定值即可

    备注: default_factory参数接受任何可调用对象,被调用后返回任何我们想要设置的值

       >>> dic = defaultdict(lambda: 11111)
       >>> dic['a']
       11111
       >>> dic
       defaultdict(<function <lambda> at 0x000001E22EDAECA8>, {'a': 11111})
       >>> defaultdict(lambda: [])  # 等同于 defaultdict(list)
       >>> 
       >>> # 其他示例:
       >>> dic = defaultdict(lambda: ([], [], []))
       >>> dic[10][2].append(11111)
       >>> dic[10][0].append(0)
       >>> dic
       defaultdict(<function <lambda> at 0x000001E22ED9E0D8>, {10: ([0], [], [11111])})
       >>> dic[10]
       ([0], [], [11111])
       >>> 
    

注:望大家批评指正,共同进步,祝好!!! 【署名:荒】

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页