news 2026/4/18 13:26:02

defaultdict详细解释

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
defaultdict详细解释

defaultdict是 Python 标准库collections模块中的一个特殊字典类,它为不存在的键提供默认值,避免KeyError异常。

基本概念

普通字典的问题

# 普通字典访问不存在的键会报错 d = {} # print(d['不存在的键']) # KeyError! # 需要先检查键是否存在 if '键' not in d: d['键'] = [] d['键'].append('值')

defaultdict的解决方案

from collections import defaultdict # 创建 defaultdict,指定默认工厂函数 d = defaultdict(list) # 默认值为空列表 d['水果'].append('苹果') # 自动创建列表并添加

主要特性

1.指定默认值类型

from collections import defaultdict # 整数类型,默认值为 0 计数器 = defaultdict(int) 计数器['苹果'] += 1 计数器['香蕉'] += 2 # 结果: {'苹果': 1, '香蕉': 2} # 列表类型,默认值为 [] 分组 = defaultdict(list) 分组['水果'].append('苹果') 分组['水果'].append('香蕉') # 结果: {'水果': ['苹果', '香蕉']} # 集合类型,默认值为 set() 标签 = defaultdict(set) 标签['文章1'].add('Python') 标签['文章1'].add('编程') # 结果: {'文章1': {'Python', '编程'}} # 字典类型,默认值为 {} 配置 = defaultdict(dict) 配置['用户']['姓名'] = '张三' 配置['用户']['年龄'] = 25

2.使用 lambda 自定义默认值

from collections defaultdict # 默认值为 100 d = defaultdict(lambda: 100) print(d['分数']) # 输出: 100 # 默认值为 "未知" d = defaultdict(lambda: "未知") print(d['姓名']) # 输出: "未知" # 复杂默认值 d = defaultdict(lambda: {"计数": 0, "总分": 0}) d['学生1']['计数'] += 1

实用示例

示例1:统计单词频率

from collections import defaultdict 文本 = "苹果 香蕉 苹果 橙子 香蕉 苹果 苹果" 单词列表 = 文本.split() 词频 = defaultdict(int) for 单词 in 单词列表: 词频[单词] += 1 print(词频) # {'苹果': 4, '香蕉': 2, '橙子': 1}

示例2:按类别分组

from collections import defaultdict 商品列表 = [ ('水果', '苹果'), ('水果', '香蕉'), ('蔬菜', '胡萝卜'), ('水果', '橙子'), ('蔬菜', '西兰花') ] 分类库 = defaultdict(list) for 类别, 商品 in 商品列表: 分类库[类别].append(商品) """ 结果: { '水果': ['苹果', '香蕉', '橙子'], '蔬菜': ['胡萝卜', '西兰花'] } """

示例3:创建树形结构

from collections import defaultdict def 树(): return defaultdict(树) 文件系统 = 树() 文件系统['home']['user']['docs']['file.txt'] = "内容" 文件系统['home']['user']['pictures']['photo.jpg'] = "图片" # 访问不存在的路径会自动创建 路径 = 文件系统['var']['log']['apache']['access.log']

示例4:统计学生成绩

from collections import defaultdict 成绩表 = [ ('张三', '数学', 90), ('张三', '英语', 85), ('李四', '数学', 95), ('李四', '英语', 88), ('张三', '物理', 92) ] # 按学生分组成绩 学生成绩 = defaultdict(list) for 姓名, 科目, 分数 in 成绩表: 学生成绩[姓名].append((科目, 分数)) # 计算每个学生的平均分 平均分 = defaultdict(float) for 姓名, 成绩列表 in 学生成绩.items(): 总分 = sum(分数 for _, 分数 in 成绩列表) 平均分[姓名] = 总分 / len(成绩列表)

与普通字典的对比

特性

普通dict

defaultdict

访问不存在的键

抛出KeyError

返回默认值

初始化复杂度

需要手动初始化

自动初始化

代码简洁性

需要条件判断

代码更简洁

内存使用

相同

相同

性能

相似

相似,但减少条件判断

使用场景

适合使用defaultdict的场景:

  1. 计数器:统计频率、计数

  2. 分组操作:将数据按某个键分组

  3. 构建嵌套结构:树形结构、图结构

  4. 避免重复的条件检查:减少if key in dict的代码

  5. 配置管理:多层级的配置项

示例:构建邻接表(图结构)

from collections import defaultdict # 图的邻接表表示 图 = defaultdict(list) 边 = [('A', 'B'), ('A', 'C'), ('B', 'D'), ('C', 'D')] for 起点, 终点 in 边: 图[起点].append(终点) # 如果是无向图 图[终点].append(起点)

注意事项

  1. 工厂函数是调用的defaultdict(int)中的int是构造函数,不是值

  2. 默认值占用内存:即使不存在的键也会返回默认值,可能占用额外内存

  3. 判断键是否存在:使用in操作符时,不存在的键不会自动添加

  4. 转换为普通字典

    d = defaultdict(int, {'a': 1, 'b': 2}) 普通字典 = dict(d) # 转换为普通字典
  5. 复制问题

    d1 = defaultdict(list, {'a': [1, 2]}) d2 = d1.copy() # 浅拷贝,列表是共享的 d2['a'].append(3) print(d1['a']) # [1, 2, 3]
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 15:28:01

Betaflight飞控固件2025:为什么说这是新手入门的完美选择?

Betaflight飞控固件2025:为什么说这是新手入门的完美选择? 【免费下载链接】betaflight Open Source Flight Controller Firmware 项目地址: https://gitcode.com/gh_mirrors/be/betaflight 还在为复杂的飞控配置而头疼?Betaflight作为…

作者头像 李华
网站建设 2026/4/19 5:18:09

硅谷可控大模型智能体 AI 关键技术

硅谷可控大模型智能体 AI 关键技术 Control is enforced at runtime, not assumed at training time. 硅谷可控大模型智能体 AI 技术以大模型智能体第一性原理为核心,融合硅谷专家多年企业级智能体系统实践,以 Controllable AI 为纲,打通 Ag…

作者头像 李华
网站建设 2026/4/19 2:17:36

Book118文档下载神器:2025最新Java工具免费获取学习资料

Book118文档下载神器:2025最新Java工具免费获取学习资料 【免费下载链接】book118-downloader 基于java的book118文档下载器 项目地址: https://gitcode.com/gh_mirrors/bo/book118-downloader 还在为Book118上的文档无法下载而烦恼吗?今天为你推…

作者头像 李华
网站建设 2026/4/18 17:49:12

一二维前缀和差分公式辨析

一维前缀和:s[i] s[i-1] a[i]一维前缀和区间查询公式:sum(l, r) s[r] - s[l-1]二维前缀和构建:s[i][j] a[i][j] s[i-1][j] s[i][j-1]- s[i-1][j-1]求两点内面积:sum s[x2][y2]- s[x1-1][y2]- s[x2][y1-1] s[x1-1][y1-1]一维差…

作者头像 李华
网站建设 2026/4/18 20:02:41

操作系统课程设计:1-多线程同步实验

1.实验目的1.掌握线程的概念及创建方法2.掌握线程互斥锁及条件变量同步机制3.掌握POSIX信号量机制4.掌握生产者消费者原理5.设计程序,两种方法实现多线程生产者消费者同步问题2.实验截图及结果分析(1)实验截图(2)实验结…

作者头像 李华
网站建设 2026/4/18 13:44:01

JSLint完整使用指南:提升JavaScript代码质量的终极工具

JSLint完整使用指南:提升JavaScript代码质量的终极工具 【免费下载链接】jslint JSLint, The JavaScript Code Quality and Coverage Tool 项目地址: https://gitcode.com/gh_mirrors/js/jslint JSLint是一款强大的JavaScript代码质量工具,由Doug…

作者头像 李华