Python字典进阶:setdefault技巧让你的代码更优雅,用setdefault优化你的Python数据处理流程

news2024/11/23 4:01:25

推荐阅读:

数据科学的秘密武器:defaultdict——Python字典的自动化填充神器,让数据结构更灵活

一、什么是setdefault

Python中的setdefault方法是字典(dict)类型的一个非常实用的方法,它允许开发者在尝试访问字典中不存在的键时,自动为该键设置一个默认值,并返回这个默认值。

 二、setdefault

基本功能

setdefault方法的基本功能是:在字典中查找指定的键,如果该键存在,则返回其对应的值;如果该键不存在,则在字典中插入该键,并将其值设置为指定的默认值,然后返回这个默认值。

语法

dict.setdefault(key, default=None)
  • key:要查找或添加的键。
  • default:可选参数,当键不存在于字典中时返回的默认值。如果未提供,则默认为None

返回值

  • 如果key在字典中,则返回key对应的值。
  • 如果key不在字典中,则插入key并将其值设为default,然后返回default

工作原理

  1. 查找键:首先,setdefault方法会在字典中查找指定的key
  2. 存在性检查
    • 如果key存在,则直接返回该key对应的值。
    • 如果key不存在,则执行下一步。
  3. 添加新键值对:在字典中插入一个新的键值对,其中key是传入的键,value是传入的default值(如果未提供,则为None)。
  4. 返回默认值:最后,返回新插入的或已存在的key对应的值(在key不存在的情况下,即为default值)。

优势

  1. 简化代码setdefault方法避免了在访问字典键之前进行显式的存在性检查,从而简化了代码。
  2. 提高可读性:使用setdefault可以使代码更加简洁和易于理解,因为它将查找和添加操作合并为一个步骤。
  3. 避免KeyError:在尝试访问不存在的键时,setdefault方法不会引发KeyError异常,而是优雅地处理这种情况。

使用场景

  1. 统计或累加字典中某些键的值:当需要统计列表中元素出现的次数时,setdefault方法非常有用。
  2. 初始化字典中的键:在构建字典时,如果希望某些键具有默认值,可以使用setdefault来初始化这些键。
  3. 处理嵌套字典:在处理嵌套字典时,setdefault可以方便地初始化不存在的嵌套层。

三、setdefault和defaultdict的区别

Python中的setdefaultdefaultdict都是在处理字典时非常有用的工具,它们都能在一定程度上避免KeyError异常,但它们在实现方式和应用场景上存在一些区别。

setdefault

setdefault是字典(dict)的一个实例方法,它接受两个参数:要查找的键(key)和默认值(default,默认为None)。如果字典中存在该键,则返回该键对应的值;如果不存在,则将该键添加到字典中,并将其值设为默认值,然后返回这个默认值。

特点

  • 是字典的一个方法,不需要导入额外的模块。
  • 只在需要时才设置默认值,避免了不必要的内存占用。
  • 返回值是键对应的值,如果键是新添加的,则返回默认值。

使用场景

  • 当你需要统计或累加字典中某些键的值时,setdefault非常有用。
  • 当你不确定字典中是否存在某个键,但想要安全地访问或修改其值时。

defaultdict

defaultdictcollections模块中的一个工厂函数,用于构建具有默认值的字典。它接受一个工厂函数作为参数,如listsetstrint等。当访问字典中不存在的键时,defaultdict会自动为该键创建一个条目,并将工厂函数的返回值作为该键的值。

特点

  • 需要从collections模块导入。
  • 为所有不存在的键提供统一的默认值类型,避免了在访问时单独设置默认值的麻烦。
  • 适用于需要默认值是列表、集合等复杂类型的情况。

使用场景

  • 当你需要构建一个字典,其所有键都应该有相同的默认值类型(如列表、集合)时。
  • 当你想要简化代码,避免在访问不存在的键时编写冗长的条件语句时。

区别总结

setdefaultdefaultdict
来源字典的实例方法collections模块的工厂函数
参数keydefault=None工厂函数(如listsetstrint等)
返回值键对应的值(如果键是新添加的,则返回默认值)键对应的值(如果键不存在,则自动创建并返回工厂函数的返回值)
使用场景统计或累加字典中某些键的值,安全地访问或修改字典中的值需要所有键具有相同默认值类型的字典,简化代码以避免冗长的条件语句
内存占用只在需要时设置默认值,较为节省内存所有不存在的键都会自动设置默认值,可能增加内存占用

四、代码案例

案例 1: 统计列表中元素的出现次数

# 定义一个列表,包含一些重复的元素  
elements = ['apple', 'banana', 'apple', 'orange', 'banana', 'grape', 'apple']  
  
# 初始化一个空字典来存储元素及其出现次数  
count = {}  
  
# 遍历列表中的每个元素  
for element in elements:  
    # 使用setdefault方法统计元素的出现次数  
    # 如果元素在字典中不存在,则添加该元素并将值设为0,然后返回0;  
    # 如果元素已存在,则直接返回该元素当前的值  
    count[element] = count.setdefault(element, 0) + 1  
  
# 打印统计结果  
print(count)  # 预期输出: {'apple': 3, 'banana': 2, 'orange': 1, 'grape': 1}

案例 2: 初始化嵌套字典

# 初始化一个空字典  
nested_dict = {}  
  
# 使用setdefault方法初始化嵌套字典的多个层级  
# 如果'level1'不存在,则添加'level1'并将值设为空字典,然后返回这个空字典  
# 接着,在返回的空字典上再次使用setdefault来添加'level2',依此类推  
nested_dict.setdefault('level1', {}).setdefault('level2', {}).setdefault('level3', 0)  
  
# 打印结果  
print(nested_dict)  # 预期输出: {'level1': {'level2': {'level3': 0}}}  
  
# 现在我们可以直接访问或修改嵌套字典的深层级  
nested_dict['level1']['level2']['level3'] = 5  
print(nested_dict)  # 预期输出: {'level1': {'level2': {'level3': 5}}}

案例 3: 使用setdefault进行默认值设置

# 初始化一个空字典  
my_dict = {}  
  
# 尝试获取键'a'的值,如果不存在则设为默认值'default_value'  
value_a = my_dict.setdefault('a', 'default_value')  
print(value_a)  # 预期输出: default_value  
print(my_dict)  # 预期输出: {'a': 'default_value'}  
  
# 再次尝试获取键'a'的值,此时'a'已存在  
value_a_again = my_dict.setdefault('a', 'new_value')  
print(value_a_again)  # 预期输出: default_value,因为'a'已存在,不会改变其值  
print(my_dict)  # 预期输出: {'a': 'default_value'}  
  
# 尝试获取键'b'的值,如果不存在则设为默认值'another_default'  
value_b = my_dict.setdefault('b', 'another_default')  
print(value_b)  # 预期输出: another_default  
print(my_dict)  # 预期输出: {'a': 'default_value', 'b': 'another_default'}

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

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

相关文章

Invalid Executable The executable contains bitcode

Invalid Executable The executable contains bitcode xcode世界xcode16后,打包上传testflight时三方库报错:Invalid Executable - The executable ***.app/Frameworks/xxx.framework/xxx contains bitcode. 解决方案: 执行一下指令删除该f…

创建单链表

一、完成单链表操作,要求节点构造类型。 1、建立学生结构体(学号,姓名,成绩) 2、循环调用头插法创建整表 3、遍历单链表 4、任意位置插入一个完整的学生信息 5、任意位置删除一个学生。 6、单链表逆置 7、单链表按照学…

Vulnhub:Fowsniff 1

靶机下载地址 信息收集 主机发现 nmap 192.168.31.0/24 -Pn -T4 靶机ip:192.168.31.134 端口扫描 nmap 192.168.31.134 -A -p- -T4 开放端口22(ssh)、80(http),和两个明文传输的邮件端口110(pop3)、143(imap)。 HTTP 访问http://192.168.31.134。…

云栖实录 | 阿里云 OpenLake 解决方案重磅发布:多模态数据统一纳管、引擎平权联合计算、数据共享统一读写

新一轮人工智能浪潮正在重塑世界,以生成式 AI 为代表的技术快速应用,推动了数据与智能的深化融合,同时也给数据基础设施带来了全新的变革与挑战。面向 AI 时代的数据基础设施如何构建?底层数据平台架构在 AI 时代如何演进&#xf…

word怎么加密?掌握这4种加密技巧,保护你的文件安全!

数字化办公社会,文档安全显得尤为重要。 无论是商业机密、个人隐私还是学术成果,我们都希望它们能在传递过程中得到妥善保护。 Word文档作为最常用的文档处理工具,用户有效保障文档的安全性是维护企业信息安全的重要渠道。 Word文档的加密是…

纯血鸿蒙APP开发启动页面无法全屏解决办法

先来看问题: 本身APP并不需要全屏,但是启动页这种特殊页面确实需要忽略页面上下的安全边界区域,解决办法也很简单,直接上代码: Image($r(app.media.launch_icon)) .width(100%) .height(100%) .expandSafeArea([SafeA…

mysql 重置密码

1.关闭mysql 服务 systemctl stop mysql.serivce 2.修改mysql的配置文件 /etc/my.cnf vi /etc/my.cnf#添加跳过登陆验证配置 skip-grant-tables 3.启动mysql systemctl start mysql.serivce 4.登陆mysql #进入到mysql的安装路径 cd /usr/local/mysql/mysql8.0/bin/ #登陆 …

SpringBoot文档管理系统:性能优化

第3章 系统分析 3.1 需求分析 在线文档管理系统主要是为了提高工作人员的工作效率和更方便快捷的满足员工,更好存储所有数据信息及快速方便的检索功能,对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑员工的可操作性,遵循…

windows桌面管理软件推荐:一键整理桌面!美化电脑桌面小助手!

windows桌面管理软件推荐来咯!在繁忙的工作和生活中,一个整洁、有序的电脑桌面不仅能提升工作效率,还能带来愉悦的视觉体验。然而,随着文件的增多,桌面往往变得杂乱无章。幸运的是,市面上有许多优秀的Windo…

CDGA|解锁数据价值:基础数据治理的至关重要性

在当今这个数据驱动的时代,数据已成为企业最宝贵的资产之一,其蕴含的价值远超传统资源。然而,要真正解锁数据的潜在价值,并非简单收集与存储即可达成,而是需要一套科学、系统的数据治理体系作为支撑。本文旨在探讨基础…

在idea里运行swing程序正常,但是在外部运行jar包却报错,可能是jdk版本问题

在idea里运行swing程序异常,报Caused by: java.awt.HeadlessException错误 System.setProperty("java.awt.headless","false");加上这句话

Spring Data Rest 远程命令执行命令(CVE-2017-8046)

(1)访问 http://your-ip:8080/customers/1,然后抓取数据包,使用PATCH请求来修改 PATCH /customers/1 HTTP/1.1 Host: Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MS…

Solidity——抽象合约和接口详解

🚀本系列文章为个人学习笔记,目的是巩固知识并记录我的学习过程及理解。文笔和排版可能拙劣,望见谅。 Solidity中的抽象合约和接口详解 目录 什么是抽象合约?抽象合约的语法接口(Interface)的定义接口的语…

Gooxi AMD Milan平台4U8卡AI服务器,兼具性能与成本的完美之选

近日,为了帮助企业从容应对当下多样化场景的算力挑战,Gooxi发布了基于AMD Milan平台的全新4U8卡AI服务器,在性能以及成本实现了完美平衡,并且在灵活性、稳定性、能耗方面实现了持续升级。 Gooxi AMD Milan平台4U8卡AI服务器是一款…

Pinia的快捷使用方法

安装Pinia npm install pinia 在main.js里面引入并注册挂载使用 在src下创建一个store inex.js // index.js import { defineStore } from pinia import { computed, ref } from vue //更简洁的的模块化 transferringValuesBetweenComponents simulationModule //简单定义了…

计算机毕业设计电影票购买网站 在线选票选座 场次订票统计 新闻留言搜索/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序

系统功能 ‌在线选票选座‌:用户可浏览电影场次,选择座位并生成订单。‌场次订票统计‌:系统实时统计各场次订票情况,便于影院管理。‌新闻发布与留言‌:发布最新电影资讯,用户可留言互动。‌搜索功能‌&a…

python标识符和关键字

1、标识符 1.1 写法 标识符由字母、下划线和数字组成,且数字不能开头。严格区分大小写。不能使用关键字。 # 标识符由字母、下划线和数字组成,且数字不能开头。 # a_1_$ 1 # print(a_1_$)# 严格区分大小写。 # Animal 1 # print(animal)# 不能使用关…

Debezium

Debezium 是一个开源的分布式平台,用于捕获数据库变化数据(Change Data Capture, CDC)。允许用户实时地从数据库中捕捉到数据的变化(如插入、更新和删除操作),并将这些变化以结构化的数据流的形式提供给其他…

Python学习——【6.1】文件操作

【6.1】文件操作 一、文件的编码 问题:计算机只能识别0和1,那么我们丰富的文本文件是如何被计算机识别,并存储在硬盘中的呢? 答:使用编码技术(密码本)将内容翻译成0和1存入。 编码技术即翻译的…

邮件发送基础:深入SMTP协议、配置邮件服务器及Python实现

目录 引言 SMTP协议基础 定义与功能 工作原理 特性与优势 邮件服务器配置 第三方邮件服务商配置 自建邮件服务器配置 使用Python发送邮件 安装smtplib和email模块 发送简单纯文本邮件 发送HTML格式邮件 发送带附件的邮件 完整示例:发送带附件的HTML邮…