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

这篇具有很好参考价值的文章主要介绍了python 中的 setdefault 方法详解、底层原理和用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、setdefault 方法功能

setdefault是Python中字典的一个方法, 它用于在字典中查找指定键 如果键存在, 则返回对应的值; 如果键不存在,则在字典中添加该键,并将其值设置为指定的默认值

2、setdefault 用法详解

dict.setdefault(key, default_value)

其中,key为要查找或添加的键,default_value为键不存在时设置的默认值。 如果省略default_value,则默认为None。文章来源地址https://www.toymoban.com/news/detail-778038.html

3、setdefault 底层原理

  • 底层实现
在Python中,字典是一种无序的键值对集合,它的底层实现是基于哈希表。
哈希表是一种根据关键字直接访问内存位置的数据结构,通过哈希函数将关键字映射到对应的内存位置。
Python中的字典是通过拉链法(chaining)实现的哈希表。
拉链法是指每个哈希桶(bucket)(下方有解释)中存储一个链表,哈希值相同的键值对会被插入到同一个链表中。当需要查找或插入一个键值对时,先计算出该键的哈希值,然后根据哈希值找到对应的哈希桶,再在该哈希桶对应的链表中查找或插入键值对。

下面是setdefault方法的底层实现步骤:

计算要查找或添加的键的哈希值,找到对应的哈希桶。

遍历哈希桶对应的链表,查找是否有键与要查找或添加的键相同。

如果找到了相同的键,则返回该键对应的值。

如果没有找到相同的键,则在链表头部添加一个新的键值对,并将键的值设置为默认值。

返回默认值作为该键的值。
  • 上面中什么是哈希桶?
哈希桶是哈希表中存储元素的容器,它是一个固定大小的数组,每个元素都是一个链表或其他容器。
哈希桶的大小是根据哈希表的负载因子(load factor)和哈希表中元素数量来计算的。

在Python中,哈希桶是一个由哈希表实现的动态数组,每个哈希桶中存储的是一条链表,链表中的每个节点都是一个键值对。
当需要查找或插入一个键值对时,先计算出该键的哈希值,然后根据哈希值找到对应的哈希桶,
再在该哈希桶对应的链表中查找或插入键值对。

哈希桶的大小通常是一个质数,这是为了保证哈希函数的均匀性和哈希表的性能。
如果哈希桶的大小比较小,会导致哈希冲突(hash collision)的概率增大,从而降低哈希表的性能;
如果哈希桶的大小比较大,会浪费内存空间。

在Python中,哈希桶的大小是动态调整的,当哈希表中元素数量达到一定阈值时,
Python会自动扩容哈希表,增加哈希桶的数量,在保证哈希函数均匀性和哈希表性能的同时,提高哈希表的存储容量。

总之,哈希桶是哈希表中存储元素的容器,它是哈希表实现的关键之一,直接影响哈希表的性能和存储容量。
  • setdefault方法的底层实现步骤:
1、计算要查找或添加的键的哈希值,找到对应的哈希桶。
2、遍历哈希桶对应的链表,查找是否有键与要查找或添加的键相同。
3、如果找到了相同的键,则返回该键对应的值。
4、如果没有找到相同的键,则在链表头部添加一个新的键值对,并将键的值设置为默认值。
5、返回默认值作为该键的值。
  • 底层实现的过程示例:
d = {"a": 1, "b": 2}

# 查找键'c'
if 'c' in d:
    value = d['c']
else:
    d['c'] = 3
    value = 3

# value = 3

# 修改键'a'的默认值
if 'a' in d:
    value = d['a']
else:
    d['a'] = 3
    value = 3

# value = 1
手动模拟了setdefault方法的实现过程。当查找键'c'时,因为该键不存在,
所以通过添加键值对的方式将键'c'的值设置为默认值3。
当查找键'a'时,因为该键已经存在,所以返回键'a'对应的值1,而不修改其默认值。

总之,setdefault方法是Python字典的一个有用的方法,它可以方便地查找和添加键值对。
对于大型的数据处理应用程序来说,使用哈希表来实现字典可以极大地提高程序的效率和性能。

4、setdefault 示例方法

4.1 添加一个新键和默认值

d = {"a": 1, "b": 2}
d.setdefault("c", 3)
print(d)  # 输出:{'a': 1, 'b': 2, 'c': 3}
# 字典d本来并没有键为'c'的元素,使用setdefault方法可以添加一个新的键'c'和默认值3

4.2 修改已有键的默认值

d = {"a": 1, "b": 2}
d.setdefault("a", 3)
print(d)  # 输出:{"a": 1, "b": 2}
# 字典d已经有键'a',使用setdefault方法仍然会返回键'a'对应的值1,而不会修改它的默认值。

4.3 可以省略默认值参数

d = {"a": 1, "b": 2}
d.setdefault("c")
print(d)  # 输出:{"a": 1, "b": 2, "c": None}
# 省略了默认值参数,此时默认值为None

4.4 在字典中嵌套一个列表

d = {}
d.setdefault("list", []).append(1)
d.setdefault("list", []).append(2)
print(d)  # 输出:{"list": [1, 2]}
# 使用setdefault方法为字典d添加一个键'list',并将其值设置为一个空列表。然后,使用列表的append方法向该列表中添加元素1和2。

到了这里,关于python 中的 setdefault 方法详解、底层原理和用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python Lambda表达式的底层原理详解:编译、执行与优化机制

    昨天面试被问到了lambda表达式的底层是怎么实现的,我直接脑子就空白了,因为平时只关注lambda的应用方式 在Python中,无论是普通函数还是Lambda函数,都会经过编译转换成字节码,解释器再执行这些字节码。 1.1 示例代码 通过 dis 模块,可以查看Lambda函数的字节码。这些字节

    2024年04月28日
    浏览(42)
  • Python中的睡眠函数用法详解

    Python中的睡眠函数用法详解 睡眠函数是Python中常用的函数之一,它允许程序在执行过程中暂停一段时间。在进行并发编程、定时任务或模拟等场景中,睡眠函数特别有用。本文将详细介绍Python中睡眠函数的用法,并提供相应的源代码。 Python中的睡眠函数由time模块提供,具体

    2024年02月05日
    浏览(56)
  • Python中的filter函数用法详解

    目录 引言 一、filter函数基本用法 二、filter函数应用场景 1、筛选符合条件的元素 2、数据清洗和预处理 3、复杂条件筛选 4、与其他函数结合使用 三、filter函数与lambda表达式 四、filter函数与列表推导式 五、总结 Python中的filter函数是一种内置的高效过滤器,用于从序列中筛选

    2024年02月21日
    浏览(56)
  • Python中的append()、add()、extend()、update()用法详解

    在列表中, append函数 用于向列表的末尾添加一个元素。例如: 需要注意的是,append函数只能添加一个元素,如果要添加多个元素,可以使用 extend函数 或者使用 加号运算符 : 在集合中,append函数并不存在。如果要向集合中添加元素,可以使用 add函数 : 需要注意的是,集

    2024年04月25日
    浏览(38)
  • python中的range函数|python中的range函数|range()函数详解|Python中range(len())的用法

    range() 是 Python 内置的一个函数,用于生成一个整数序列。具体来说,它的定义如下: start、stop、step 分别表示序列的起始值、终止值和步长。start 和 step 是可选参数,如果不指定则默认为 0 和 1。 当只传入一个参数时,表示生成从 0 开始、小于该参数的整数序列。例如: 这

    2024年02月07日
    浏览(65)
  • 【Python】9.函数用法和底层分析

    函数是可重用的程序代码块。函数的作用,不仅可以实现代码的复用,更能实现代码的一致性。一致性指的是,只要修改函数的代码,则所有调用该函数的地方都能得到体现。 在编写函数时,函数体中的代码写法和我们前面讲述的基本一致,只是对代码实现了封装,并增加了

    2024年02月06日
    浏览(48)
  • spring中的事务及底层原理

    在Spring框架中,事务管理是一个关键的特性,它允许开发者在应用程序中声明性地管理事务。Spring事务管理的核心是基于AOP(面向切面编程)和IOC(控制反转)的思想。以下是Spring中事务管理的一些重要概念和底层原理: 事务管理器(Transaction Manager): Spring事务管理的底层

    2024年01月19日
    浏览(41)
  • Java中的Iterator底层原理实现

    Iterator主要有 两个抽象方法 ,让子类实现。 hasNext ()用来判断还有没有数据可供访问。 next ()方法用于访问集合的下一个数据。 这两个方法不像List的get()那样依赖索引获取数据,也不像Queue的poll方法那样依赖特定规则获取数据。 迭代器的方法将通用性做到了极致, 可以访问

    2023年04月12日
    浏览(33)
  • Python cv.StereoSGBM_create方法参数与用法详解

    创建StereoSGBM(semi-global block matching)对象。该对象实现了半全局匹配算法。 cv.StereoSGBM_create([, minDisparity[, numDisparities[, blockSize[, P1[, P2[, disp12MaxDiff[, preFilterCap[, uniquenessRatio[, speckleWindowSize[, speckleRange[, mode]]]]]]]]]]]) - retval minDisparity:最小可能的差异值。正常情况下,它为零,但

    2024年02月05日
    浏览(54)
  • 【C++】详解多态的底层原理

    上一篇文章我们学习了多态的语法,想必大家都会有很多疑问,这篇文章,我们就来带大家看看多态是如何实现的,它底层的原理是怎样的… 需要声明的,本文中的代码及解释都是在vs2022下的x86程序中,涉及的指针都是4bytes。 如果要其他平台下,部分代码需要改动。比如:

    2024年02月16日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包