深入底层了解Python字典和集合,一眼看穿他们的本质!

Python中的字典(dict)和集合(set)是两个强大且常用的数据结构,它们在处理数据和解决问题时发挥着重要作用。深入了解这两种数据结构的底层实现和用法将有助于编写更高效、灵活和可读性强的代码。

Python字典(dict)

字典的基本概念

字典是一种无序、可变、可迭代的键值对集合。每个键值对都由一个唯一的键和对应的值组成。字典中的键必须是不可变的(通常是字符串、数字或元组),而值可以是任意对象。

创建字典

在Python中,可以使用大括号 {} 来创建字典。例如:

my_dict = {'name': 'John', 'age': 30, 'city': 'New York'}
字典的基本操作
  • 获取值:通过键获取对应的值。

print(my_dict['name'])  # 输出: John
  • 修改值:通过键修改对应的值。
my_dict['age'] = 31
  • 添加新键值对:
my_dict['gender'] = 'Male'
  • 删除键值对:
del my_dict['city']

字典的底层实现

Python中的字典是通过哈希表(hash table)实现的。哈希表是一种高效的数据结构,通过将键映射到存储值的索引位置,可以在常数时间内完成查找、插入和删除操作。

哈希表的工作原理
  1. 哈希函数: 将键映射为整数,作为数组的索引。Python内置的hash()函数用于生成哈希值。

  2. 冲突解决: 不同的键可能映射到相同的索引,这称为冲突。常见的解决方法有链地址法和开放寻址法。

  3. 数组: 哈希表使用数组存储键值对,每个数组元素称为桶。每个桶可能存储一个键值对或形成链表,存储多个键值对。

字典的性能

字典的平均时间复杂度为 O(1),即常数时间。然而,最坏情况下可能为 O(n),其中 n 是字典中的键值对数量。这通常发生在哈希冲突较多时。

Python集合(set)

集合是一种无序、可变、不重复的元素集。它是基于哈希表实现的,与字典类似,但只包含键而没有对应的值。

创建集合

使用大括号 {} 或者 set() 构造函数可以创建集合。

my_set = {1, 2, 3, 4, 5}
集合的基本操作
  • 添加元素:

my_set.add(6)
  • 移除元素:
my_set.remove(3)
  • 检查元素是否存在:
print(2 in my_set)  # 输出: True

集合的底层实现

集合的底层实现与字典相似,同样使用哈希表。实际上,集合本质上是字典中只有键而没有值的特例。

集合的应用
  • 去重: 集合是无重复元素的,因此非常适合用于去除列表或其他可迭代对象中的重复元素。

unique_numbers = set([1, 2, 2, 3, 4, 4, 5])
  • 集合操作: 集合支持交集、并集、差集等操作,对于数学集合运算非常有用。
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}intersection = set1 & set2  # 交集
union = set1 | set2  # 并集
difference = set1 - set2  # 差集

深入理解Python字典和集合的底层实现有助于更好地利用它们的特性,并写出更高效、可读性更强的代码。字典和集合作为Python中的重要数据结构,为程序员提供了处理数据和解决问题的强大工具。通过了解哈希表的工作原理、字典的性能特点以及集合的应用,学习者能够更好地运用这两种数据结构,提高编程水平。在实际应用中,合理选择字典或集合,根据问题的特性选择适当的数据结构,有助于提高代码的效率和可维护性。

黑马程序员python教程,8天python从入门到精通,学python看这套就够了

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

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

相关文章

vue element 修改dialog 关闭按钮颜色

.el-dialog__headerbtn .el-dialog__close, .el-dialog__headerbtn:focus .el-dialog__close, .el-dialog__headerbtn:hover .el-dialog__close {color: white; }

详解SpringCloud微服务技术栈:Feign远程调用、最佳实践、错误排查

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:详解SpringCloud微服务技术栈:Nacos配置管理 📚订阅专栏:微服务技术全家桶 希望文章对你们有…

Python src/pyaudio/device_api.c:9:10: fatal error: portaudio.h: 没有那个文件或目录

在安装Pyaudio的时候报错,portaudio.h: 没有那个文件或目录,解决办法如下: sudo apt-get install libasound-dev portaudio19-dev libportaudio2 libportaudiocpp0 安装Pyaudio pip install PyAudio -i https://mirrors.bfsu.edu.cn/pypi/…

积木游戏

题目描述 小云和小吉在玩积木游戏,他们手上有很多积木,每个积木上面都有一个字母。 现在他们把所有的积木都排在一条队列上,队列有一个完美值,这个完美值就是积木队列上的字母组成的字符串的字典序,字典序越大完美值…

MyBatis - DAO 接口(Mapper.xml)支持方法重载吗?

方法重载(Method Overloading)是指在同一个类中定义多个方法,它们具有相同的方法名但参数列表不同。 Dao 在 MyBatis 的 DAO 层接口中,是允许方法重载的。 在 DAO 层接口中,可以根据不同的需求和条件定义多个方法&am…

蓝桥杯青少年创意编程大赛:激发少儿编程潜能,培养未来科技之星

随着科技的飞速发展,编程已经成为了当今世界的一项重要技能。为了培养更多的编程人才,蓝桥杯官网显示,蓝桥杯青少年创意编程大赛应运而生。作为国内有影响力的少儿编程赛事之一,蓝桥杯青少年创意编程大赛旨在激发青少年对编程的兴…

​Portkey AI网关:一个用来连接多种人工智能模型的开源工具

简介 它允许开发者通过一个简单的API接口来访问超过100种不同的大语言模型。包括OpenAI、Anthropic、Mistral、LLama2、Anyscale、Google Gemini等。安装体积只有45kb,处理速度提升了9.9倍,可以在多个不同的AI模型中来回切换。可以根据自己的需要进行灵…

找不到mfc100.dll的解决方法,怎么修复mfc100.dll文件

当我们在使用电脑时,时常可能会遇到各类系统提示的错误信息。"找不到mfc100.dll" 就是这些错误之一,该错误提示会妨碍我们执行一些应用程序或特定代码。为了帮助读者克服这个技术障碍,本篇文章将详尽阐明导致该问题的根本原因&…

【Flutter 问题系列第 80 篇】TextField 输入框组件限制可输入的最大长度后,输入的内容中包含表情符号时,获取输入的内容数还是会超出限制的问题

这是【Flutter 问题系列第 80 篇】,如果觉得有用的话,欢迎关注专栏。 博文当前所用 Flutter SDK:3.10.5、Dart SDK:3.0.5 一:问题描述 在输入用户名称、简介等内容时,一般我们都会限制输入框内最大可输入…

The Feast and the Bus

JebTrains的员工正在庆祝一年中的第256天!JebTrains有 n 名员工和 k 个团队。每个员工都是某个(恰好是一个)团队的成员。所有队伍的编号从 1 到 k。您将得到一个数字数组 t1、t2、…、tn,其中ti是第i个员工的团队编号。 JebTrains…

FFMPEG解码实时流,支持cpu、gpu解码

官网下载的ffmpeg目前只能下载到X64版本的库,具体编译请参考windows编译ffmpeg源码(32位库)_windows 32位ffmpeg动态库-CSDN博客 直接上代码 int VideoDecodeModule::Open(std::string strUrl) {AVFormatContext *pFormatCtx nullptr;AVCo…

Python 学习笔记——一认识Python

Python 简介 Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。 Python 由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。 像 Perl 语言一样, Python 源代码同样遵循 GPL(GNU General Public License) 协议。 Python 特点 1…

电脑本地连接不见了怎么恢复?5个方法轻松解决问题!

“我在使用电脑时,突然发现我的本地连接不见了,这是怎么回事呢?有什么方法可以解决这个问题吗?” 电脑的本地连接是一种将电脑与局域网连接的方式。局域网是一种小型的网络,通常在建筑物内或地理位置相近的少量计算机之…

Python数据分析案例33——新闻文本主题多分类(Transformer, 组合模型) 模型保存

案例背景 对于海量的新闻,我们可能需要进行文本的分类。模型构建很重要,现在对于自然语言处理基本都是神经网络的方法了。 本次这里正好有一组质量特别高的新闻数据,涉及 教育 科技 社会 时政 财经 房产 家居 七大主题,基本涵盖…

Grafana(三)Grafana 免密登录-隐藏导航栏-主题变换

一. 免密登录 Grafana 的常用方式: 将配置好的Grafana图嵌入到系统页面中 为了实现可免登录访问,可以通过如下方式进行设置: 1. 修改Grafana配置文件 在Grafana的配置文件 /etc/grafana/grafana.ini 中,找到 [auth.anonymous] 配…

深度剖析 ThreadLocal 内存泄露问题及解决方案

引言 在多线程编程中,ThreadLocal 是一个常用的工具,用于在每个线程中维护独立的变量,避免了线程间的数据共享问题。然而,使用不当时,ThreadLocal 可能引发内存泄露,这是一个开发者们常常需要面对的难题。…

SaaS 与 AWS 云:协同创新的崭新时代

在云计算的潮流下,SaaS(Software as a Service)模型和AWS(Amazon Web Services)云平台的结合为企业带来了前所未有的灵活性、可扩展性和效率。这两者的协同作用开启了一场数字化时代的创新浪潮,重新定义着企…

记一次Log记录大对象导致的CPU异常和磁盘打满

代码里有个大对象Map,缓存了100M数据,在多线程任务中记录异常的任务时错误地记录了这个Map,导致JSON序列化时疯狂刷磁盘写入数据,导致磁盘被打满,CPU100%,机器拒绝访问。

P9842 [ICPC2021 Nanjing R] Klee in Solitary Confinement 题解(SPJ!!!)

[ICPC2021 Nanjing R] Klee in Solitary Confinement 题面翻译 给定 n , k n,k n,k 和一个长为 n n n 的序列,你可以选择对区间 [ l , r ] [l, r] [l,r] 的数整体加上 k k k,也可以不加。最大化众数出现次数并输出。 题目描述 Since the travele…