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

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

时间:2024-09-24 14:19:33浏览次数:9  
标签:进阶 setdefault Python value default dict 默认值 字典

推荐阅读:

数据科学的秘密武器: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'}

标签:进阶,setdefault,Python,value,default,dict,默认值,字典
From: https://blog.csdn.net/qq_51431069/article/details/142485875

相关文章

  • Python写入文件内容:从入门到精通
    在日常编程工作中,我们常常会遇到需要将数据保存至磁盘的需求。无论是日志记录、配置文件管理还是数据持久化,掌握如何有效地使用Python来写入文件内容都是必不可少的一项技能。本文将从基础语法开始,逐步深入探讨Python中写入文件内容的各种技巧,并通过具体的实例帮助你快速上手,直至能......
  • 基于SqlAlchemy+Pydantic+FastApi的Python开发框架
    随着大环境的跨平台需求越来越多,对与开发环境和实际运行环境都有跨平台的需求,Python开发和部署上都是跨平台的,本篇随笔介绍基于SqlAlchemy+Pydantic+FastApi的Python开发框架的技术细节,以及一些技术总结。最近这几个月一直忙于Python开发框架的整合处理,将之前开发框架中很多重要......
  • Python中的`os`模块:掌控系统的力量
    引言随着软件工程的发展,越来越多的应用不再局限于单一文件或目录的操作,而是需要跨多个文件夹甚至不同设备之间进行数据交换和处理。这时候,了解如何通过编程语言访问底层操作系统功能就变得尤为重要了。Python中的os模块正是为此而生,它提供了一系列用于与操作系统进行交互的方法,帮......
  • python打包的exe文件为什么有时候运行很慢有时候很快?
    大家好,我是Python进阶者。一、前言前几天在Python最强王者交流群【哎呦喂 是豆子~】问了一个Python打包处理的问题。问题如下:大佬们 请问下 你们有没有遇到这种情况 python打包的exe文件为什么有时候运行很慢有时候很快? 同一个exe文件 有时候等个5秒就可以弹出输入框有......
  • Python知识点:如何使用Python与Java进行互操作(Jython)
    开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候!Jython是一种完全兼容Java的Python实现,它将Python代码编译成Java字节码,这样就可以在Java虚拟机(JVM)上运行。使用Jython,你可以无缝地调用Java类库和P......
  • Python中的集合:解锁数据处理的新维度
    引言集合是一种无序且不允许重复元素的数据类型。在日常开发中,无论是去除列表中的重复项还是判断两个集合之间的关系(如交集、并集等),集合都能提供简洁高效的解决方案。此外,集合的内部实现使得查找某个元素的时间复杂度接近O(1),这使得它在处理大规模数据时表现得尤为出色。......
  • Python函数艺术:掌握编程中的“乐高积木”
    引言函数是程序设计的基本单元之一,它使得代码模块化,提高了重用性和可读性。无论是处理数据、操作文件还是实现特定业务逻辑,掌握好函数的设计与使用都是至关重要的技能。在Python中,定义一个函数非常直观且强大,这使得即使是初学者也能快速上手,并随着经验积累不断发掘其深层价......
  • python打包的exe文件为什么有时候运行很慢有时候很快?
    大家好,我是Python进阶者。一、前言前几天在Python最强王者交流群【哎呦喂 是豆子~】问了一个Python打包处理的问题。问题如下:大佬们 请问下 你们有没有遇到这种情况 python打包的exe文件为什么有时候运行很慢有时候很快? 同一个exe文件 有时候等个5秒就可以弹出输入框......
  • 基于MicroPython的ESP8266控制GP2D12红外测距传感器模块的设计方案
       以下是一个基于MicroPython的ESP8266控制GP2D12红外测距传感器模块的设计方案:一、硬件准备:1. ESP8266开发板(如NodeMCU)2. GP2D12红外测距传感器模块3. 杜邦线若干4.3.3V和5V直流电源二、硬件连接:1. 将ESP8266开发板的VCC和GND引脚,通过杜邦线,分别连接到3.......
  • python爬虫连载26 Cookie和Session
    Cookie和SessionHTTP是无状态的,Cookie和Session则对此作了补充。其中Cookie是保存在客户端,Session保存在服务器端。Cookie是由服务器生成后发送给客户端的,浏览器会解析这些Cookie并将Cookie保存为一个本地文件,浏览器会自动将同一个服务器的任何请求绑定上这些Cookie。Cookie的工作......