Day 09:【99天精通Python】字典与集合 - 键值对与去重利器

Day 09:【99天精通Python】字典与集合 - 键值对与去重利器

前言

欢迎来到第9天!

在之前的学习中,我们使用了列表元组来存储有序的数据序列。但是,如果我们想要存储"姓名"对应的"电话号码",或者"商品ID"对应的"价格",用列表就显得有点麻烦了(你需要两个列表或者去遍历查找)。

今天我们要介绍Python中两个非常强大的数据结构:字典(Dictionary)集合(Set)。它们不再通过索引(0, 1, 2…)来访问数据,而是通过键(Key)或者内容本身来快速定位。

本节内容:

  • 字典的概念与创建
  • 字典的增删改查
  • 字典的常用方法与遍历
  • 集合的创建与去重
  • 集合的数学运算(交集、并集等)
  • 实战练习

一、字典(Dictionary):键值对的管家

1.1 什么是字典?

字典是Python中唯一的内置映射类型。它存储的是键值对(Key-Value Pair)。就像我们要查《新华字典》一样,通过拼音(Key)能快速找到对应的汉字解释(Value)。

特点

  1. 键值对:数据以key: value形式存储。
  2. 键唯一:同一个字典中,键必须是唯一的。
  3. 无序性:在Python 3.6之前字典无序,3.7+开始保留插入顺序,但我们通常仍将其视为无序容器。
  4. 可变:可以动态增删改。

字典

Key: 'name'

Value: 'Alice'

Key: 'age'

Value: 25

Key: 'city'

Value: 'Beijing'

1.2 创建字典

# 方式1:使用花括号 {}(最常用)person={"name":"Alice","age":25,"is_student":True}# 方式2:使用 dict() 函数book=dict(title="Python入门",price=59.9,author="Guido")# 方式3:创建空字典empty_dict={}# 或者empty_dict2=dict()print(person)print(book)

注意:字典的键(Key)必须是不可变类型(如字符串、数字、元组),通常使用字符串。**值(Value)**可以是任意类型。

1.3 访问字典的值

person={"name":"Alice","age":25}# 方式1:通过键访问 [key]print(person["name"])# Alice# 如果键不存在,会报错 KeyError# print(person["gender"]) # KeyError: 'gender'# 方式2:使用 get(key) 方法(推荐)print(person.get("name"))# Aliceprint(person.get("gender"))# None(键不存在时不报错,返回None)# get() 可以设置默认值print(person.get("gender","未知"))# 未知

二、字典的增删改查

2.1 添加与修改

字典的添加和修改语法是一样的:dict[key] = value

  • 如果键不存在 ->添加
  • 如果键已存在 ->修改
info={"name":"Bob"}# 添加info["age"]=30print(info)# {'name': 'Bob', 'age': 30}# 修改info["name"]="Bobby"print(info)# {'name': 'Bobby', 'age': 30}

2.2 删除元素

info={'name':'Bobby','age':30,'city':'Shanghai'}# 1. del 关键字delinfo['age']print(info)# {'name': 'Bobby', 'city': 'Shanghai'}# 2. pop(key) - 删除并返回值city=info.pop('city')print(city)# Shanghaiprint(info)# {'name': 'Bobby'}# 3. clear() - 清空字典info.clear()print(info)# {}

2.3 常用操作

student={"id":101,"name":"Tom","score":95}# 获取所有键print(student.keys())# dict_keys(['id', 'name', 'score'])# 获取所有值print(student.values())# dict_values([101, 'Tom', 95])# 获取所有键值对print(student.items())# dict_items([('id', 101), ('name', 'Tom'), ('score', 95)])# 检查键是否存在print("name"instudent)# Trueprint("age"instudent)# False

三、字典的遍历

由于字典存储的是键值对,遍历方式比较灵活。

scores={"Alice":95,"Bob":88,"Charlie":92}# 1. 默认遍历(遍历键)fornameinscores:print(name)# 2. 遍历值forscoreinscores.values():print(score)# 3. 遍历键值对(最常用)forname,scoreinscores.items():print(f"{name}的分数是:{score}")

四、集合(Set):去重专家

4.1 什么是集合?

集合(Set)是一个无序的、不重复的元素序列。它的主要作用是去重数学集合运算

你可以把它理解为:只有 Key 没有 Value 的字典。

4.2 创建集合

# 方式1:使用花括号 {}fruits={"apple","banana","orange","apple"}# 重复的apple会被自动去除print(fruits)# {'banana', 'orange', 'apple'}(顺序不固定)# 方式2:使用 set() 函数(常用于列表去重)numbers=[1,2,2,3,3,3]unique_nums=set(numbers)print(unique_nums)# {1, 2, 3}# 【注意】创建空集合必须用 set(),不能用 {}empty_set=set()empty_dict={}# 这是空字典

4.3 集合的操作

s={1,2,3}# 添加s.add(4)print(s)# {1, 2, 3, 4}# 删除s.remove(2)# 如果元素不存在会报错s.discard(10)# 如果元素不存在不会报错(推荐)print(s)# {1, 3, 4}# 随机弹出一个元素item=s.pop()

4.4 集合运算(交、并、差)

集合最强大的地方在于数学运算。

a={1,2,3,4}b={3,4,5,6}# 交集 (&):两者都有的print(a&b)# {3, 4}print(a.intersection(b))# 并集 (|):两者合起来的(去重)print(a|b)# {1, 2, 3, 4, 5, 6}print(a.union(b))# 差集 (-):a中有但b中没有的print(a-b)# {1, 2}print(a.difference(b))# 对称差集 (^):互相没有的(并集 - 交集)print(a^b)# {1, 2, 5, 6}

并集 A | B

集合 B

5

6

集合 A

1

2

交集 A & B

3

4


五、列表、字典、集合对比

特性列表 (List)字典 (Dict)集合 (Set)
定义符号[]{k:v}{}
有序性有序3.7+保留顺序无序
重复性允许重复键不可重复不可重复
访问方式索引[0]['key']无法直接访问单个
查询速度慢 O(n)快 O(1)快 O(1)
用途顺序数据键值对应数据去重、集合运算

性能小贴士:如果你需要在海量数据中快速查找某个元素是否存在,使用字典或集合比列表快得多(哈希查找 vs 遍历查找)。


六、实战练习

练习1:词频统计

统计一段文本中每个单词出现的次数。

text="python java python c++ java python python"words=text.split()# 将字符串分割成列表# 方式1:使用普通字典counts={}forwordinwords:ifwordincounts:counts[word]+=1else:counts[word]=1print(counts)# {'python': 4, 'java': 2, 'c++': 1}# 方式2:使用 get() 简化counts={}forwordinwords:counts[word]=counts.get(word,0)+1print(counts)

练习2:列表去重并保持顺序

列表[1, 5, 2, 1, 9, 1, 5],去除重复元素。

data=[1,5,2,1,9,1,5]# 简单去重(顺序可能会乱)print(list(set(data)))# 保持顺序去重(利用字典键的特性,Python 3.7+)print(list(dict.fromkeys(data)))# [1, 5, 2, 9]

练习3:共同好友推荐

用户A的好友是{"小红", "小明", "小刚"},用户B的好友是{"小红", "小强", "小刚"}

  1. 找出他们的共同好友。
  2. 找出可能认识的人(A的好友中B不认识的,或反之)。
friends_a={"小红","小明","小刚"}friends_b={"小红","小强","小刚"}# 共同好友 (交集)common=friends_a&friends_bprint(f"共同好友:{common}")# {'小红', '小刚'}# 可能认识的人 (对称差集)maybe_know=friends_a^friends_bprint(f"推荐好友:{maybe_know}")# {'小明', '小强'}

七、常见问题

Q1:字典的键可以是列表吗?

不可以。字典的键必须是不可变类型(可哈希的)。列表是可变的,所以不能做键。但元组可以(只要元组里不包含可变对象)。

# { [1, 2]: "value" } # 报错 TypeError: unhashable type: 'list'{(1,2):"value"}# 正确

Q2:字典和JSON是一回事吗?

非常像,但不是一回事。

  • 字典:Python的一种数据结构。
  • JSON:一种数据交换格式(字符串)。
  • 它们可以通过json模块相互转换。

八、小结

Day 09 字典与集合

字典 Dict

集合 Set

键值对 {k:v}

查询速度快 O(1)

方法: get, keys, items

无序不重复 {}

去重

运算: & | - ^

关键要点

  1. 遇到"键值对应"的数据,首选字典
  2. 遇到"去重"或"集合运算"的需求,首选集合
  3. 字典的.get()方法可以避免 Key不存在导致的报错。
  4. 字典和集合的查找速度非常快,适合处理大量数据的检索。

九、课后作业

  1. 通讯录系统:创建一个空字典作为通讯录,实现循环输入用户的"姓名"和"电话",如果姓名已存在则提示更新,输入"quit"退出并打印所有联系人。
  2. 字符统计:输入一个字符串,统计每个字符出现的次数(不区分大小写),并按字符顺序输出。
  3. 选课系统
    • 选择了"Python"课程的学生集合:{'A', 'B', 'C', 'D'}
    • 选择了"Java"课程的学生集合:{'C', 'D', 'E', 'F'}
    • 请计算:同时选了两门课的学生?只选了Python的学生?总共有多少学生选课?

下节预告

Day 10:函数基础(Function)- 我们将学习如何将代码打包成可重复使用的模块,这是编程进阶的第一步!


系列导航

  • 上一篇:Day 08 - 列表推导式与元组
  • 下一篇:Day 10 - 函数基础(待更新)

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

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

相关文章

软件I2C总线空闲状态判断逻辑:快速理解

软件I2C总线空闲状态判断:从原理到实战的深度拆解你有没有遇到过这样的情况?明明代码逻辑写得清清楚楚,可I2C通信就是“时好时坏”——有时候能读到传感器数据,有时候却连设备都找不到。调试半天发现,并不是地址错了&a…

Mybatis:关联映射

一、创建表结构1.学生表SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for student -- ---------------------------- DROP TABLE IF EXISTS student; CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT,Sname …

嘉立创EDA画PCB教程:STM32最小系统设计完整指南

从零开始打造STM32最小系统:嘉立创EDA实战全记录你是不是也曾在搜索“嘉立创eda画pcb教程”时,翻遍资料却仍被一堆术语绕晕?电源不稳、晶振不起、程序下不进去……明明照着电路连的,为什么就是跑不起来?别急。今天我们…

Keil与Proteus联调方法:零基础小白指南

Keil 与 Proteus 联调实战:从零开始搭建虚拟单片机实验室你是否曾因为没有开发板而无法完成单片机作业?是否在调试代码时,对着不亮的 LED 束手无策,却不知是程序写错了还是电路接反了?别担心——Keil 与 Proteus 联调&…

操作指南:利用波特图优化频率响应性能

用波特图“把脉”电路:手把手教你优化频率响应,让系统稳如泰山你有没有遇到过这样的情况?一个电源样机焊好了,输入输出电压都没问题,可一加负载,输出就开始“抽搐”——电压不停振荡,示波器上波…

嵌入式环境下堆溢出导致crash的系统学习

堆溢出为何让嵌入式系统“猝死”?一次 HardFault 背后的真相你有没有遇到过这样的场景:设备在实验室跑得好好的,一到现场却隔三差五重启;调试器抓到的调用栈停在free()里,但代码里明明没写错;翻遍逻辑也找不…

STM32CubeMX教程中SDIO接口初始化项目应用

用STM32CubeMX搞定SDIO:从配置到文件系统的实战全解析在嵌入式开发中,存储大容量数据早已不是“加分项”,而是许多项目的硬性需求。无论是工业设备的日志记录、医疗仪器的采样存储,还是音视频终端的缓存处理,都需要稳定…

⚡_实时系统性能优化:从毫秒到微秒的突破[20260110173735]

作为一名专注于实时系统性能优化的工程师,我在过去的项目中积累了丰富的低延迟优化经验。实时系统对性能的要求极其严格,任何微小的延迟都可能影响系统的正确性和用户体验。今天我要分享的是在实时系统中实现从毫秒到微秒级性能突破的实战经验。 &#…

ModbusTCP协议详解实时性优化在STM32上的实践

ModbusTCP协议详解:在STM32上实现高实时性通信的工程实践工业现场,时间就是控制命脉。一个典型的场景是:主控PLC通过以太网向远程I/O模块读取传感器状态,若响应延迟超过5ms,整个运动控制环路就可能失稳。而当你打开Wir…

REINFORCE 算法

摘要:REINFORCE算法是一种基于蒙特卡洛的策略梯度强化学习方法,由Williams于1992年提出。该算法通过采样完整情节轨迹,计算回报梯度并更新策略参数来优化智能体决策。其优势在于无需环境模型、实现简单且能处理高维动作空间,但存在…

Linux 运维:删除大日志文件时避免磁盘 IO 飙升,echo 空文件 vs truncate 命令对比实操

作为一名摸爬滚打11年的老运维,我踩过无数次“删大日志搞崩服务器”的坑。凌晨4点,监控告警疯狂刷屏:磁盘 IO 使用率 100%!业务响应超时!排查后发现,是同事直接 rm -rf 了一个 80G 的 Nginx 访问日志——瞬…

ARM Cortex-M开发前必做:Keil5MDK安装与初步设置全面讲解

从零开始搭建ARM开发环境:Keil5MDK安装与配置实战指南 你是不是刚接触嵌入式开发,面对琳琅满目的工具链无从下手? 或者已经下载了Keil但点击“Download”时弹出一堆错误提示,心里直犯嘀咕:“我到底漏了哪一步&#x…

SARSA 强化学习

摘要:SARSA是一种基于在线策略的强化学习算法,其名称来源于"状态-动作-奖励-状态-动作"的学习序列。该算法通过Q值迭代更新,使智能体在环境中通过试错法学习最优策略。核心流程包括Q表初始化、ε-贪婪策略选择动作、执行动作获取奖…

10 分钟搞定 RabbitMQ 高可用:HAProxy 负载均衡实战指南

在分布式系统中,RabbitMQ作为常用消息中间件,集群部署是保障高可用的关键。但很多开发者会遇到一个棘手问题:Java程序直接绑定RabbitMQ节点的IP和端口后,一旦该节点宕机,程序就会连接失败,只能手动修改配置…

告别“算完就忘”:3行代码为Windows打造可审计计算器

面对复杂的四则运算,你是否也经历过对计算结果的自我怀疑?那个藏在电脑角落的批处理文件,每次运行时都在默默为你的每一步计算留下无法抵赖的铁证。 痛点:我们为什么需要“计算留痕”? 在日常工作、财务对账或工程计算…

MDK编译优化选项对C代码的影响:一文说清原理

MDK编译优化选项对C代码的影响:从原理到实战的深度剖析一个困扰无数嵌入式工程师的问题你有没有遇到过这样的场景?调试一段ADC采样代码时,明明在主循环里读取了一个由中断更新的标志变量,但程序就是“卡住”不动——断点停在那里&…

超详细版:CubeMX搭建FreeRTOS与CAN通信驱动流程

从零搭建STM32实时通信系统:CubeMX FreeRTOS CAN 驱动实战指南你有没有遇到过这样的场景?主循环里塞满了ADC采样、LED闪烁、串口打印,突然来了个CAN报文要发,结果因为某个任务卡了几十毫秒,通信直接超时。更糟的是&a…

智慧物流如何重塑云南高原农产品供应链?

📌 目录🚛 松茸24小时直达东京!华为智慧冷链改写云南山货命运:从烂半路到全球鲜,数字高铁如何逆袭?一、传统物流的“生死劫”:山货出山,一半耗在半路(一)核心…

Multisim参数扫描分析:深度剖析其配置技巧

Multisim参数扫描分析实战:从入门到精通的深度指南你有没有过这样的经历?为了调出一个理想的滤波器响应,手动改了十几遍电容值,每次都要重新运行仿真、切换窗口对比曲线,最后不仅眼睛累,还漏掉了关键的转折…

计算机毕设 java 基于 Java 的武夷智能公交系统的设计与实现 智能公交信息管理平台 城市公交路线查询系统

计算机毕设 java 基于 Java 的武夷智能公交系统的设计与实现 d60429(配套有源码 程序 mysql 数据库 论文)本套源码可以先看具体功能演示视频领取,文末有联 xi 可分享随着城市交通的快速发展和居民出行需求的提升,传统公交管理存在…