collections中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__函数返回值 - ① 常用内置数据类型对象:int, str, float, bool, 他们对应的默认值 int() == 0, str() ==’’, float()==0.0, bool() is False

-
基于上一条设置任意常量值方法,添加一个函数等返回固定值即可
备注: 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]) >>>
注:望大家批评指正,共同进步,祝好!!! 【署名:荒】

defaultdict是Python的collections模块中一个便利的数据结构,它在字典基础上扩展,当尝试获取不存在的键时,会自动添加键并初始化为指定默认值。本文介绍了defaultdict的构造函数、__missing__方法的工作原理,并详细讲解了default_factory参数可以接受的值,包括None、内置数据类型、数据结构以及自定义对象。通过示例展示了defaultdict在实际操作中的用法。
291

被折叠的 条评论
为什么被折叠?



