python collections.defaultdict 介绍及使用场景

  • 分类: Python
  • 发表日期:2023-09-04 08:54:00
  • 最后修改:2024-07-04 08:54:00

collections.defaultdict 是 Python 标准库 collections 模块中的一个类,它提供了字典的所有功能,但具有一个额外的特点:它允许你为字典提供一个默认值工厂函数,当访问不存在的键时,字典会自动插入一个带有默认值的新条目,而不是引发 KeyError 异常。

以下是 defaultdict 的主要特性和用法:

创建 defaultdict

要创建一个 defaultdict,你需要传递一个工厂函数给它,这个工厂函数决定了当访问不存在的键时所插入的默认值。例如:

from collections import defaultdict

# 使用 int 作为默认值工厂函数
d = defaultdict(int)
print(d['key'])  # 输出 0

# 使用 list 作为默认值工厂函数
d = defaultdict(list)
print(d['key'])  # 输出 []

# 使用 lambda 函数指定默认值
d = defaultdict(lambda: 'default value')
print(d['key'])  # 输出 'default value'

使用场景

defaultdict 通常用于需要处理大量键值对数据的场景,尤其是当访问的键可能不存在时。以下是几个常见的使用场景:

  1. 计数器
    s = 'mississippi'
    d = defaultdict(int)
    for char in s:
        d[char] += 1
    print(d)
    # 输出: defaultdict(<class 'int'>, {'m': 1, 'i': 4, 's': 4, 'p': 2})
    
  1. 分组元素
    items = [('apple', 1), ('banana', 2), ('apple', 3), ('banana', 4)]
    d = defaultdict(list)
    for fruit, number in items:
        d[fruit].append(number)
    print(d)
    # 输出: defaultdict(<class 'list'>, {'apple': [1, 3], 'banana': [2, 4]})
    
  1. 构建多层字典
    d = defaultdict(lambda: defaultdict(int))
    d['outer']['inner'] += 1
    print(d)
    # 输出: defaultdict(<function <lambda> at 0x...>, {'outer': defaultdict(<class 'int'>, {'inner': 1})})
    

注意事项

  • defaultdict 的默认值工厂函数在键第一次被访问时调用,仅在该时刻创建默认值。
  • 由于 defaultdict 是一个字典子类,因此可以使用所有标准字典方法。
  • 直接访问不存在的键会触发默认值创建,但如果你想避免这种行为,可以先检查键是否存在:
  if 'key' in d:
      print(d['key'])

使用 collections.defaultdict 可以简化代码,避免手动检查键是否存在,从而提高代码的可读性和简洁性。

 

post
2021年7月9日 09:40 原创 草稿

针对情报平台的多种 es dsl 测试

post
2021年7月13日 09:36 原创
post
2021年7月30日 12:01 原创
post
2021年7月30日 12:15 原创
post
2021年7月30日 15:07 原创
post
2021年7月30日 15:13 原创
post
2021年7月30日 15:18 原创
post
2021年7月30日 15:24 原创
post
2021年7月30日 16:09 原创
post
2021年7月30日 16:02 原创
post
2021年8月16日 15:28 原创
post
2021年8月16日 20:01
post
2021年8月17日 12:07 原创
post
2021年8月31日 15:42 原创
post
2021年10月8日 16:17
post
2021年10月13日 11:43
post
2021年10月21日 15:47 原创
post
2021年10月25日 11:27
post
2023年8月18日 20:39 原创 未公开

本博客部署教程

0 评论

大哥整点话呗~