找回密码
 会员注册
查看: 23|回复: 0

python中的setdefault方法详解、底层原理和用法

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
71613
发表于 2024-9-6 12:15:48 | 显示全部楼层 |阅读模式
1、setdefault方法功能setdefault是Python中字典的一个方法,它用于在字典中查找指定键如果键存在,则返回对应的值;如果键不存在,则在字典中添加该键,并将其值设置为指定的默认值2、setdefault用法详解dict.setdefault(key,default_value)1其中,key为要查找或添加的键,default_value为键不存在时设置的默认值。如果省略default_value,则默认为None。3、setdefault底层原理底层实现在Python中,字典是一种无序的键值对集合,它的底层实现是基于哈希表。哈希表是一种根据关键字直接访问内存位置的数据结构,通过哈希函数将关键字映射到对应的内存位置。Python中的字典是通过拉链法(chaining)实现的哈希表。拉链法是指每个哈希桶(bucket)(下方有解释)中存储一个链表,哈希值相同的键值对会被插入到同一个链表中。当需要查找或插入一个键值对时,先计算出该键的哈希值,然后根据哈希值找到对应的哈希桶,再在该哈希桶对应的链表中查找或插入键值对。下面是setdefault方法的底层实现步骤:计算要查找或添加的键的哈希值,找到对应的哈希桶。遍历哈希桶对应的链表,查找是否有键与要查找或添加的键相同。如果找到了相同的键,则返回该键对应的值。如果没有找到相同的键,则在链表头部添加一个新的键值对,并将键的值设置为默认值。返回默认值作为该键的值。12345678910111213141516上面中什么是哈希桶?哈希桶是哈希表中存储元素的容器,它是一个固定大小的数组,每个元素都是一个链表或其他容器。哈希桶的大小是根据哈希表的负载因子(loadfactor)和哈希表中元素数量来计算的。在Python中,哈希桶是一个由哈希表实现的动态数组,每个哈希桶中存储的是一条链表,链表中的每个节点都是一个键值对。当需要查找或插入一个键值对时,先计算出该键的哈希值,然后根据哈希值找到对应的哈希桶,再在该哈希桶对应的链表中查找或插入键值对。哈希桶的大小通常是一个质数,这是为了保证哈希函数的均匀性和哈希表的性能。如果哈希桶的大小比较小,会导致哈希冲突(hashcollision)的概率增大,从而降低哈希表的性能;如果哈希桶的大小比较大,会浪费内存空间。在Python中,哈希桶的大小是动态调整的,当哈希表中元素数量达到一定阈值时,Python会自动扩容哈希表,增加哈希桶的数量,在保证哈希函数均匀性和哈希表性能的同时,提高哈希表的存储容量。总之,哈希桶是哈希表中存储元素的容器,它是哈希表实现的关键之一,直接影响哈希表的性能和存储容量。123456789101112131415setdefault方法的底层实现步骤:1、计算要查找或添加的键的哈希值,找到对应的哈希桶。2、遍历哈希桶对应的链表,查找是否有键与要查找或添加的键相同。3、如果找到了相同的键,则返回该键对应的值。4、如果没有找到相同的键,则在链表头部添加一个新的键值对,并将键的值设置为默认值。5、返回默认值作为该键的值。12345底层实现的过程示例:d={"a":1,"b":2}#查找键'c'if'c'ind:value=d['c']else:d['c']=3value=3#value=3#修改键'a'的默认值if'a'ind:value=d['a']else:d['a']=3value=3#value=112345678910111213141516171819'运行运行手动模拟了setdefault方法的实现过程。当查找键'c'时,因为该键不存在,所以通过添加键值对的方式将键'c'的值设置为默认值3。当查找键'a'时,因为该键已经存在,所以返回键'a'对应的值1,而不修改其默认值。总之,setdefault方法是Python字典的一个有用的方法,它可以方便地查找和添加键值对。对于大型的数据处理应用程序来说,使用哈希表来实现字典可以极大地提高程序的效率和性能。1234564、setdefault示例方法4.1添加一个新键和默认值d={"a":1,"b":2}d.setdefault("c",3)print(d)#输出:{'a':1,'b':2,'c':3}#字典d本来并没有键为'c'的元素,使用setdefault方法可以添加一个新的键'c'和默认值31234'运行运行4.2修改已有键的默认值d={"a":1,"b":2}d.setdefault("a",3)print(d)#输出:{"a":1,"b":2}#字典d已经有键'a',使用setdefault方法仍然会返回键'a'对应的值1,而不会修改它的默认值。1234'运行运行4.3可以省略默认值参数d={"a":1,"b":2}d.setdefault("c")print(d)#输出:{"a":1,"b":2,"c":None}#省略了默认值参数,此时默认值为None1234'运行运行4.4在字典中嵌套一个列表d={}d.setdefault("list",[]).append(1)d.setdefault("list",[]).append(2)print(d)#输出:{"list":[1,2]}#使用setdefault方法为字典d添加一个键'list',并将其值设置为一个空列表。然后,使用列表的append方法向该列表中添加元素1和2。12345'运行运行
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 05:03 , Processed in 1.444550 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表