news 2026/1/23 12:05:49

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 - 函数基础(待更新)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/17 18:10:35

JLink驱动开发深度剖析:固件加载机制详解

深入JLink固件加载机制:从设备连接到稳定调试的底层逻辑 你有没有遇到过这样的情况? 新买的JLink插上电脑,设备管理器里却显示“未知设备”;或者IDE提示 Connection Failed: Firmware Mismatch ,重启、换线、重装驱…

作者头像 李华
网站建设 2026/1/22 7:44:09

STM32上手ModbusTCP:新手教程从零开始

从零开始在 STM32 上实现 ModbusTCP 通信:手把手实战指南 你是不是也遇到过这样的场景?项目需要让一个嵌入式设备和上位机、HMI 或 PLC 打通数据,但各家协议五花八门,开发起来头疼。这时候, ModbusTCP 就成了那个“万…

作者头像 李华
网站建设 2026/1/22 22:49:12

IAR下载常见问题解析:一文说清解决方案

IAR下载失败?别慌,一文搞懂从原理到实战的完整解决方案 你有没有过这样的经历:代码改得信心满满,点下“Download and Debug”那一刻却弹出一个刺眼的红色提示——“ Failed to connect to target ”? 或者更糟的是…

作者头像 李华
网站建设 2026/1/19 6:39:58

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

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

作者头像 李华
网站建设 2026/1/23 6:13:47

基于Java+SpringBoot+SSM物流管理系统(源码+LW+调试文档+讲解等)/物流管理软件/物流信息管理系统/供应链物流管理系统/企业物流管理系统/物流仓储管理系统/智能物流管理系统

博主介绍 💗博主介绍:✌全栈领域优质创作者,专注于Java、小程序、Python技术领域和计算机毕业项目实战✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 2025-2026年最新1000个热门Java毕业设计选题…

作者头像 李华