[Python] 内置类defaultdict(默认字典)介绍和使用场景(案例)

defaultdict(默认字典)类介绍

defaultdict是collections模块中的一个类,它是dict类的一个子类。它的主要特点是当键不存在时,会自动调用一个指定的工厂函数来返回一个默认值,而不会抛出KeyError异常。

defaultdict的类原型如下:

class collections.defaultdict([default_factory[, ...]])

defaultdict类的构造函数可以接收一个可调用的工厂函数作为参数。该工厂函数将在键不存在时被调用,返回一个默认值。

collections — Container datatypes — Python 3.12.1 documentation

主要方法包括:

  • __init__ (self[, default_factory]): 创建一个defaultdict对象。default_factory参数为可选,用于指定工厂函数,默认为None。
  • __missing__(self, key): 当键不存在时,会调用__missing__方法去生成一个默认值。

[Python] 内置类defaultdict(默认字典)介绍和使用场景(案例)_第1张图片

[Python] 内置类defaultdict(默认字典)介绍和使用场景(案例)_第2张图片 

总的来说,defaultdict类通过使用工厂函数来自动生成默认值,简化了对不存在键的处理,提高了代码的简洁性和可读性。

使用案例

使用 list 作为 default_factory,很轻松地将(键-值对组成的)序列转换为(键-列表组成的)字典:

from collections import defaultdict
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
    d[k].append(v)

sorted(d.items())

[Python] 内置类defaultdict(默认字典)介绍和使用场景(案例)_第3张图片

当每个键第一次遇见时,它还没有在字典里面,所以自动创建该条目,即调用 default_factory 方法,返回一个空的 list。 list.append() 操作添加值到这个新的列表里。当再次存取该键时,就正常操作,list.append() 添加另一个值到列表中。这个计数比它的等价方法 dict.setdefault() 要快速和简单:

d = {}
for k, v in s:
    d.setdefault(k, []).append(v)

sorted(d.items())

设置 default_factory 为 int,使 defaultdict 用于计数(类似其他语言中的 bag 或 multiset):

s = 'mississippi'
d = defaultdict(int)
for k in s:
    d[k] += 1

sorted(d.items())

当一个字母首次遇到时,它会查询失败,则 default_factory 会调用 int() 来提供一个整数 0 作为默认值。后续的自增操作建立起对每个字母的计数。

函数 int() 总是返回 0,这是常数函数的特殊情况。一个更快和灵活的方法是使用 lambda 函数,可以提供任何常量值(不只是0):

def constant_factory(value):
    return lambda: value

d = defaultdict(constant_factory(''))
d.update(name='John', action='ran')
'%(name)s %(action)s to %(object)s' % d

设置  为 set 使 defaultdict 用于构建 set 集合:

s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
d = defaultdict(set)
for k, v in s:
    d[k].add(v)

sorted(d.items())

[Python] 内置类defaultdict(默认字典)介绍和使用场景(案例)_第4张图片

你可能感兴趣的:(python,python,defaultdict)