Day 09:【99天精通Python】字典与集合 - 键值对与去重利器
前言
欢迎来到第9天!
在之前的学习中,我们使用了列表和元组来存储有序的数据序列。但是,如果我们想要存储"姓名"对应的"电话号码",或者"商品ID"对应的"价格",用列表就显得有点麻烦了(你需要两个列表或者去遍历查找)。
今天我们要介绍Python中两个非常强大的数据结构:字典(Dictionary)和集合(Set)。它们不再通过索引(0, 1, 2…)来访问数据,而是通过键(Key)或者内容本身来快速定位。
本节内容:
- 字典的概念与创建
- 字典的增删改查
- 字典的常用方法与遍历
- 集合的创建与去重
- 集合的数学运算(交集、并集等)
- 实战练习
一、字典(Dictionary):键值对的管家
1.1 什么是字典?
字典是Python中唯一的内置映射类型。它存储的是键值对(Key-Value Pair)。就像我们要查《新华字典》一样,通过拼音(Key)能快速找到对应的汉字解释(Value)。
特点:
- 键值对:数据以
key: value形式存储。 - 键唯一:同一个字典中,键必须是唯一的。
- 无序性:在Python 3.6之前字典无序,3.7+开始保留插入顺序,但我们通常仍将其视为无序容器。
- 可变:可以动态增删改。
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}五、列表、字典、集合对比
| 特性 | 列表 (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的好友是{"小红", "小强", "小刚"}。
- 找出他们的共同好友。
- 找出可能认识的人(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模块相互转换。
八、小结
关键要点:
- 遇到"键值对应"的数据,首选字典。
- 遇到"去重"或"集合运算"的需求,首选集合。
- 字典的
.get()方法可以避免 Key不存在导致的报错。 - 字典和集合的查找速度非常快,适合处理大量数据的检索。
九、课后作业
- 通讯录系统:创建一个空字典作为通讯录,实现循环输入用户的"姓名"和"电话",如果姓名已存在则提示更新,输入"quit"退出并打印所有联系人。
- 字符统计:输入一个字符串,统计每个字符出现的次数(不区分大小写),并按字符顺序输出。
- 选课系统:
- 选择了"Python"课程的学生集合:
{'A', 'B', 'C', 'D'} - 选择了"Java"课程的学生集合:
{'C', 'D', 'E', 'F'} - 请计算:同时选了两门课的学生?只选了Python的学生?总共有多少学生选课?
- 选择了"Python"课程的学生集合:
下节预告
Day 10:函数基础(Function)- 我们将学习如何将代码打包成可重复使用的模块,这是编程进阶的第一步!
系列导航:
- 上一篇:Day 08 - 列表推导式与元组
- 下一篇:Day 10 - 函数基础(待更新)