【Python】深入了解 defaultdict:轻松处理默认值与复杂数据结构

文章目录

    • 1. 深入理解 Python 中的 defaultdict:简化数据结构处理的利器
    • 2. defaultdict 基础概念
    • 3. 创建 defaultdict 实例
      • 3.1 基本用法
      • 3.2 使用其他工厂函数
    • 4. defaultdict 的应用场景
      • 4.1 计数器
      • 4.2 分组数据
    • 5. defaultdict 的高级用法
      • 5.1 嵌套 defaultdict
      • 5.2 自定义默认值
    • 6. 总结

1. 深入理解 Python 中的 defaultdict:简化数据结构处理的利器

在 Python 的标准库中,collections 模块提供了许多强大的数据结构,其中 defaultdict 是一个非常实用的工具。defaultdict 继承自内置的 dict 类型,它可以在访问不存在的键时自动提供默认值,这一特性使得处理复杂的数据结构变得更加简单和直观。在这篇文章中,我将详细介绍 defaultdict 的使用方法和应用场景,并通过代码示例帮助理解它的强大功能。

2. defaultdict 基础概念

defaultdict 的工作原理与普通的字典类似,但它允许你为不存在的键设置一个默认值。创建一个 defaultdict 对象时,需要传入一个工厂函数,这个函数返回你希望在访问不存在的键时使用的默认值。这样,当你试图访问一个不存在的键时,defaultdict 会自动调用工厂函数并使用其返回值来填充缺失的项,而不会引发 KeyError 异常。

3. 创建 defaultdict 实例

3.1 基本用法

from collections import defaultdict# 创建一个 defaultdict,默认值为整数 0
dd = defaultdict(int)# 添加一些键值对
dd['apple'] = 10
dd['banana'] = 5# 访问存在的键
print(dd['apple'])  # 输出: 10# 访问不存在的键,自动创建键并设置默认值 0
print(dd['orange'])  # 输出: 0# 打印 defaultdict 对象的内容
print(dd)  # 输出: defaultdict(<class 'int'>, {'apple': 10, 'banana': 5, 'orange': 0})

解释: defaultdict(int) 创建了一个 defaultdict 对象,其中 int 是一个工厂函数,返回 0。访问已存在的键时,defaultdict 会返回对应的值。访问不存在的键时,defaultdict 会调用 int() 函数,返回默认值 0。

3.2 使用其他工厂函数

defaultdict 可以使用各种工厂函数来生成默认值。例如,可以使用 list 工厂函数来创建一个默认值为列表的 defaultdict

from collections import defaultdict# 创建一个 defaultdict,默认值为空列表
dd = defaultdict(list)# 添加一些键值对
dd['fruits'].append('apple')
dd['fruits'].append('banana')
dd['vegetables'].append('carrot')# 打印 defaultdict 对象的内容
print(dd)  # 输出: defaultdict(<class 'list'>, {'fruits': ['apple', 'banana'], 'vegetables': ['carrot']})

解释: defaultdict(list) 创建了一个 defaultdict 对象,其中 list 是一个工厂函数,返回一个空列表。当访问不存在的键时,defaultdict 会自动创建一个空列表作为默认值。这对于将多个值归类到相同的键下非常有用。

4. defaultdict 的应用场景

4.1 计数器

使用 defaultdict 进行计数是一种常见的应用场景。例如,计算字符串中每个字符出现的次数。

from collections import defaultdicttext = "hello world"
char_count = defaultdict(int)for char in text:char_count[char] += 1# 打印字符计数结果
print(dict(char_count))  # 输出: {'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}

解释: defaultdict(int) 被用来计数字符串 text 中每个字符的出现次数。每次访问字符时,defaultdict 会自动初始化计数器为 0,然后加 1。这种方式使得计数操作变得非常简洁。

4.2 分组数据

defaultdict 也可以用来对数据进行分组。例如,将数据按类别进行分组并存储在列表中。

from collections import defaultdictdata = [('fruit', 'apple'),('fruit', 'banana'),('vegetable', 'carrot'),('fruit', 'orange'),('vegetable', 'broccoli')
]grouped_data = defaultdict(list)for category, item in data:grouped_data[category].append(item)# 打印分组后的数据
print(dict(grouped_data))  # 输出: {'fruit': ['apple', 'banana', 'orange'], 'vegetable': ['carrot', 'broccoli']}

解释: defaultdict(list) 用于将数据按类别进行分组。每次遇到一个新的类别时,defaultdict 会自动创建一个空列表,然后将项追加到该列表中。这种方法在处理分类数据时非常高效。

5. defaultdict 的高级用法

5.1 嵌套 defaultdict

有时需要创建多层嵌套的字典结构。可以使用 defaultdict 创建嵌套字典来实现这一点。

from collections import defaultdict# 创建一个嵌套的 defaultdict
nested_dd = defaultdict(lambda: defaultdict(int))# 添加数据
nested_dd['2024']['January'] = 5
nested_dd['2024']['February'] = 8
nested_dd['2025']['January'] = 3# 打印嵌套的 defaultdict 对象
print(dict(nested_dd))  
# 输出: {'2024': {'January': 5, 'February': 8}, '2025': {'January': 3}}

解释: 在这个示例中,使用了一个 lambda 函数来创建嵌套的 defaultdict。外层 defaultdict 的默认值是另一个 defaultdict(int),这使得可以创建一个多层嵌套的字典结构。这样可以方便地组织复杂的数据层次。

5.2 自定义默认值

除了使用内置的工厂函数,还可以定义自定义的默认值生成函数。例如,可以创建一个 defaultdict,其默认值为自定义的对象或计算结果。

from collections import defaultdictclass CustomObject:def __init__(self, value):self.value = valuedef __repr__(self):return f"CustomObject(value={self.value})"def default_value():return CustomObject("default")# 创建一个 defaultdict,默认值为 CustomObject 对象
custom_dd = defaultdict(default_value)# 访问不存在的键
print(custom_dd['key'])  # 输出: CustomObject(value=default)# 打印 defaultdict 对象的内容
print(custom_dd)  # 输出: defaultdict(<function default_value at ...>, {'key': CustomObject(value=default)})

解释: 在这个示例中,定义了一个 CustomObject 类,并创建了一个 defaultdict,其默认值为 CustomObject 实例。通过自定义的 default_value 函数,defaultdict 可以创建具有特定属性的默认对象。

6. 总结

defaultdict 是一个非常强大的工具,在处理字典数据结构时可以显著简化代码和提高效率。它不仅能够自动提供默认值,还能够与各种工厂函数和自定义函数结合使用,适应不同的数据处理需求。从简单的计数到复杂的嵌套字典,defaultdict 的灵活性和便利性使得它在许多应用场景中成为了不可或缺的工具。

希望这篇文章能帮助你更好地理解和使用 defaultdict,并将其应用到实际项目中。


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/46813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么流程图在项目管理中如此重要?

在我们的日常学习生活中&#xff0c;是不是感觉工作复杂繁琐&#xff0c;知识杂乱无章呢&#xff1f;那么流程图能够完美的解决这个问题&#xff0c;本文将会用一篇文章告诉你什么是流程图&#xff0c;流程图简单来说就是一种以图形方式表示算法、工作流程或过程的图表&#xf…

云服务器重置密码后,xshell远程连接不上,重新启用密码登录方式

云服务器重置密码后 &#xff0c;xshell连接出现不能使用密码登录 解决方案&#xff1a;以下来自阿里云重新启用密码登录方式帮助文档 为轻量应用服务器创建密钥且重启服务器使密钥生效后&#xff0c;服务器会自动禁止使用root用户及密码登录。如果您需要重新启用密码登录方式&…

数据结构-java中链表的存储原理及使用方式

目录 链表&#xff08;线性表的链式存储&#xff09; 代码实例&#xff1a;&#xff08;链表构建&#xff0c;头插尾插&#xff09; LinkedList LinkedList的使用&#xff1a; 1、构造方法 2、操作方法 LinkedList 和 ArrayList 的区别 链表&#xff08;线性表的链式存储…

基于python的图像去水印

1 代码 import cv2 import numpy as npdef remove_watermark(image_path, output_path):# 读取图片image cv2.imread(image_path)# 转换为灰度图gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用中值滤波去除噪声median_filtered cv2.medianBlur(gray, 5)# 计算图像的梯…

【Python学习笔记】:Python爬取音频

【Python学习笔记】&#xff1a;Python爬取音频 背景前摇&#xff08;省流可以不看&#xff09;&#xff1a; 人工智能公司实习&#xff0c;好奇技术老师训练语音模型的过程&#xff0c;遂请教&#xff0c;得知训练数据集来源于爬取某网页的音频。 很久以前看B站同济子豪兄的《…

实验三:图像的平滑滤波

目录 一、实验目的 二、实验原理 1. 空域平滑滤波 2. 椒盐噪声的处理 三、实验内容 四、源程序和结果 (1) 主程序&#xff08;matlab&#xff09; (2) 函数GrayscaleFilter (3) 函数MeanKernel (4) 函数MedFilter 五、结果分析 1. 空域平滑滤波 2. 椒盐噪声的处理…

【数据结构与算法 经典例题】判断二叉树是否对称

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法 经典例题》C语言 期待您的关注 目录 一、问题描述 二、解题思路 三、C语言实现代码 一、问题描述 给你一个二…

AI论文精读笔记-MAE

1. 论文基本信息 论文标题&#xff1a;Masked Autoencoders Are Scalable Vision Learners 作者&#xff1a;Kaiming He∗,† Xinlei Chen∗ Saining Xie Yanghao Li Piotr Doll ́ ar Ross Girshick 发表时间和期刊&#xff1a;19 Dec 2021; arxiv 论文链接&#xff1a;Mas…

【大模型书籍】从零开始大模型开发与微调:基于PyTorch与ChatGLM(附PDF)

哈喽各位&#xff0c;今天又来给大家分享大模型学习书籍了&#xff0c;今天是这本<从零开始大模型开发与微调&#xff1a;基于PyTorch与ChatGLM 书籍PDF分享>&#xff0c;大模型是深度学习自然语言处理皇冠上的一颗明珠&#xff0c;也是当前AI和NLP研究与产业中最重要的方…

HTML+CSS+JS用户管理(可储存用户数据)

使用cookies记录账号密码信息&#xff0c;可以注册、登录、注销账号。 点赞❤️收藏⭐️关注&#x1f60d; 效果图 源代码在效果图后面 源代码 HTML <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <…

docker desktop历史版本安装

1.安装choco Windows安装 choco包管理工具-CSDN博客 2.通过choco安装 下面例子为安装旧版2.3.0.2,其它版本类似 Chocolatey Software | Docker Desktop 2.3.0.2 https://download.docker.com/win/stable/45183/Docker%20Desktop%20Installer.exe choco install docker-des…

前端报错adding CSS “touch-action: none“ to this element解决方案

目录 如图所示控制台出现报错&#xff1a; 原因&#xff1a; touch-action 介绍&#xff1a; 解决方案&#xff1a; 1.手动设置touch-action&#xff1a; 2.使用条件渲染&#xff1a; 3.CSS样式隔离&#xff1a; 4.浏览器兼容性&#xff1a; 5. 忽略警告 如图所示控制台…

Windows虚拟摄像头有哪些?分享5个方法,手机一键替换电脑摄像头!

Windows虚拟摄像头怎么用&#xff1f;当我们的电脑缺少摄像头时&#xff0c;我们可以借助虚拟摄像头实现。手机作为电脑摄像头的需求日益增长&#xff0c;本文就来给大家详细介绍&#xff0c;关于电脑虚拟摄像头的使用和说明&#xff0c;一起来看看吧&#xff01; &#xff08;…

微服务实战系列之玩转Docker(二)

前言 上一篇&#xff0c;博主对Docker的背景、理念和实现路径进行了简单的阐述。作为云原生技术的核心之一&#xff0c;轻量级的容器Docker&#xff0c;受到业界追捧。因为它抛弃了笨重的OS&#xff0c;也不带Data&#xff0c;可以说&#xff0c;能够留下来的都是打仗的“精锐…

Vue3 前置知识

1. Vue3 简介 2020年9月18日&#xff0c;Vue.js发布版3.8版本&#xff0c;代号&#xff1a;one Piece(海贼王)经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者官方发版地址&#xff1a;Release v3.0.0 One Piecevuejs/,core截止2023年10月&#xff0c;最新的公开版…

LRU CaChe(内存替换算法)

六、LURCache 0、LUR Cache概念 LRU是Least Recently Used的缩写&#xff0c;意思是最近最少使用&#xff0c;它是一种Cache替换算法。 什么是Cache&#xff1f;狭义的Cache指的是位于CPU和主存间的快速RAM&#xff0c;通常它不像系统主存那样使用DRAM技术&#xff0c;而使用昂…

打开磁盘格式为NTFS的磁盘 ntfs磁盘无法打开 移动硬盘出现ntfs怎么打不开了的原因和解决方案

在日常的工作和生活中&#xff0c;移动硬盘作为我们存储和传输数据的重要工具&#xff0c;发挥着不可替代的作用。然而&#xff0c;有时候我们会遇到这样一个问题&#xff1a;移动硬盘突然显示NTFS格式&#xff0c;并且无法正常打开。面对这种情况&#xff0c;我们往往感到束手…

【系统架构设计师】十一、系统架构设计(层次架构风格|MVC|面向服务的架构风格|ESB)

目录 五、层次架构风格 5.1 两层C/S架构 5.2 三层C/S架构 5.3 三层B/S架构 5.4 MVC架构 5.5 MVP架构 5.6 MVVM架构 六、面向服务的架构风格 6.1 SOA特征 6.2 Web Service 6.2.1 关键技术 6.2.2 WEB Service 6.3 企业服务总线ESB 相关推荐 历年真题练习 五、层次…

【MAUI】生命周期

.NET Multi-platform App UI (.NET MAUI) 应用通常有四种执行状态&#xff1a;“未运行”、“运行中”、“已停用”和“已停止”。 当应用从未运行状态转换为运行状态、从运行状态转换为已停用状态、从已停用状态转换为已停止状态、从已停止状态转换为运行状态&#xff0c;以及…

new mars3d.graphic.FixedRoute({的position长度超过一百条浏览器会卡死的解决方案

问题场景描述&#xff1a; FixedRoute的position数据已经很精细时&#xff0c;会导致卡死的问题 解决方案&#xff1a; 1. 数据已经很精细时&#xff0c;可以不用autoSurfaceHeight来计算&#xff0c;如果非要用&#xff0c;可以加个minDistance: 200参数。 fixedRoute.auto…