news 2026/5/31 1:21:04

Python数据结构(下):字典、集合及综合练习

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python数据结构(下):字典、集合及综合练习

在上一篇《Python数据结构(上)》中,我们介绍了列表(list)和元组(tuple)这两种常用的数据结构。本篇将继续深入,介绍另外两种重要的内置数据结构——字典(dictionary)集合(set),并结合实际案例进行综合练习,帮助你更好地掌握它们的应用场景与操作方法。


一、字典(Dictionary)

1.1 什么是字典?

字典是 Python 中一种无序、可变、键值对(key-value pair)存储的数据结构。它用花括号{}定义,每个元素由一个“键”和一个“值”组成,通过键来快速查找对应的值。

✅ 特点:

  • 键必须是不可变类型(如字符串、数字、元组)
  • 值可以是任意类型
  • 键具有唯一性,不允许重复

1.2 创建字典

# 方法1:直接定义

student = {

"name": "张三",

"age": 20,

"major": "计算机科学"

}

# 方法2:使用 dict() 构造函数

person = dict(name="李四", age=22, city="北京")

# 方法3:从键值对列表创建

data = [("a", 1), ("b", 2)]

d = dict(data) # {'a': 1, 'b': 2}

1.3 字典的基本操作

# 访问值

print(student["name"]) # 输出:张三

# 添加或修改

student["grade"] = "大二" # 添加新键值对

student["age"] = 21 # 修改已有值

# 删除键值对

del student["major"]

# 检查键是否存在

if "name" in student:

print("存在 name 键")

# 获取所有键、值、键值对

print(student.keys()) # dict_keys(['name', 'age', 'grade'])

print(student.values()) # dict_values(['张三', 21, '大二'])

print(student.items()) # dict_items([('name', '张三'), ('age', 21), ('grade', '大二')])

1.4 遍历字典

for key in student:

print(key, ":", student[key])

# 或更推荐的方式

for key, value in student.items():

print(f"{key}: {value}")


二、集合(Set)

2.1 什么是集合?

集合是一种无序、不重复元素的容器,常用于去重和集合运算(如并集、交集等)。集合使用花括号{}set()函数创建,注意:空集合只能用set()创建,{}表示空字典。

✅ 特点:

  • 元素唯一,自动去重
  • 元素必须是不可变类型
  • 不支持索引访问

2.2 创建集合

# 方法1:使用花括号(非空时)

fruits = {"apple", "banana", "apple", "orange"}

print(fruits) # {'apple', 'banana', 'orange'} —— 自动去重

# 方法2:使用 set() 函数

numbers = set([1, 2, 2, 3, 4]) # {1, 2, 3, 4}

# 空集合

empty_set = set()

2.3 集合的基本操作

# 添加元素

fruits.add("grape")

# 删除元素

fruits.remove("banana") # 若不存在会报错

fruits.discard("kiwi") # 安全删除,不存在也不报错

# 集合运算

set_a = {1, 2, 3}

set_b = {3, 4, 5}

print(set_a | set_b) # 并集: {1, 2, 3, 4, 5}

print(set_a & set_b) # 交集: {3}

print(set_a - set_b) # 差集: {1, 2}

print(set_a ^ set_b) # 对称差集: {1, 2, 4, 5}


三、字典 vs 集合 vs 列表对比

特性列表(list)字典(dict)集合(set)
是否有序否(Python 3.7+ 保持插入顺序)
是否可变
元素是否唯一键唯一,值可重复
访问方式索引(如 list[0])键(如 dict['name'])不支持索引
典型用途存储有序数据存储键值映射去重、集合运算

四、综合练习:学生成绩管理系统

下面我们通过一个实际案例,综合运用列表、字典和集合,实现一个简单的学生成绩管理功能。

需求描述:

  1. 存储多个学生的姓名、年龄、科目成绩(数学、英语)
  2. 支持添加学生、查询平均分、统计不及格人数
  3. 统计所有出现过的科目(使用集合去重)
  4. 找出数学和英语都及格的学生名单

实现代码:

# 学生数据列表,每个学生是一个字典

students = [

{"name": "张三", "age": 20, "math": 85, "english": 78},

{"name": "李四", "age": 19, "math": 56, "english": 92},

{"name": "王五", "age": 21, "math": 73, "english": 65},

{"name": "赵六", "age": 20, "math": 90, "english": 88}

]

# 1. 添加新学生

def add_student(name, age, math, english):

students.append({

"name": name,

"age": age,

"math": math,

"english": english

})

add_student("钱七", 19, 45, 70)

# 2. 计算所有学生的平均分

def average_score(subject):

total = sum(s[subject] for s in students)

return total / len(students)

print(f"数学平均分: {average_score('math'):.2f}")

print(f"英语平均分: {average_score('english'):.2f}")

# 3. 统计不及格人数(任一科目 < 60)

fail_count = 0

for s in students:

if s["math"] < 60 or s["english"] < 60:

fail_count += 1

print(f"不及格人数: {fail_count}")

# 4. 使用集合获取所有科目(扩展性好)

subjects = set()

for s in students:

subjects.update(s.keys())

# 过滤掉非成绩字段

subjects = {s for s in subjects if s in ["math", "english"]}

print("所有科目:", subjects)

# 5. 找出两科都及格的学生

good_students = []

for s in students:

if s["math"] >= 60 and s["english"] >= 60:

good_students.append(s["name"])

print("双科及格学生:", good_students)

输出结果:

数学平均分: 76.80 英语平均分: 78.20 不及格人数: 2 所有科目: {'math', 'english'} 双科及格学生: ['张三', '王五', '赵六']

五、小结

  • 字典适用于需要通过“键”快速查找“值”的场景,如配置信息、用户资料等。
  • 集合擅长处理去重和集合运算,在数据分析、筛选中非常实用。
  • 在实际开发中,经常将列表 + 字典 + 集合组合使用,发挥各自优势。

掌握这些数据结构,不仅能提升代码效率,还能让你写出更清晰、更易维护的程序。


六、课后练习

  1. 编写一个函数,接收一个单词列表,返回每个单词中不同字母组成的集合。
  2. 使用字典统计一段文本中每个字符出现的次数。
  3. 模拟两个班级的学生名单(用集合),找出共同参加活动的学生(交集)。

💡 提示:多动手实践是掌握数据结构的最佳方式!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 22:37:20

C#如何利用插件实现.NET Core大文件上传的权限控制?

【一个.NET程序员的悲喜交加&#xff1a;前端搞定了&#xff0c;后端求包养&#xff01;】 各位道友好&#xff01;俺是山西某个人.NET程序员&#xff0c;刚啃完《C#从入门到住院》&#xff0c;就被客户按头要求搞个20G大文件上传下载系统。现在前端用Vue3原生JS硬怼出了半成品…

作者头像 李华
网站建设 2026/5/29 17:38:20

Excalidraw在远程办公中的5大应用场景

Excalidraw在远程办公中的5大应用场景 如今&#xff0c;一场会议的成败早已不再取决于谁准备了最精美的PPT。当分布式团队成为常态&#xff0c;跨时区协作日益频繁&#xff0c;真正决定效率的&#xff0c;是能否在最短时间内把模糊的想法变成所有人“看得见、摸得着”的共同认知…

作者头像 李华
网站建设 2026/5/28 4:29:51

Open-AutoGLM等待时间动态调控深度解析,掌握这一篇就够了

第一章&#xff1a;Open-AutoGLM等待时间动态调控概述 在高并发场景下&#xff0c;模型推理服务的响应延迟直接影响用户体验与系统吞吐能力。Open-AutoGLM 作为一款支持自动调度与负载均衡的生成式语言模型框架&#xff0c;其核心特性之一便是对请求等待时间的动态调控机制。该…

作者头像 李华
网站建设 2026/5/30 11:30:56

【独家技术解密】:Open-AutoGLM长按事件捕获原理与性能优化

第一章&#xff1a;Open-AutoGLM长按操作精准触发在移动设备或触控界面中&#xff0c;长按操作是一种常见的用户交互方式。Open-AutoGLM 通过优化事件监听机制&#xff0c;实现了对长按操作的精准识别与响应。该机制不仅提升了用户体验&#xff0c;还为复杂手势控制提供了底层支…

作者头像 李华
网站建设 2026/5/29 0:58:12

Open-AutoGLM实时响应优化实战(从卡顿到毫秒级切换的秘密)

第一章&#xff1a;从卡顿到毫秒级响应——Open-AutoGLM优化之旅的起点在现代大语言模型应用中&#xff0c;用户体验往往直接受制于推理延迟。Open-AutoGLM 作为一款开源的自动化代码生成模型&#xff0c;在初期版本中虽具备强大的语义理解能力&#xff0c;但其端到端响应时间常…

作者头像 李华
网站建设 2026/5/29 23:27:24

【高可用系统必备技能】:Open-AutoGLM重试次数自适应算法详解

第一章&#xff1a;Open-AutoGLM 重试次数智能设置在构建高可用的自动化推理系统时&#xff0c;合理配置 Open-AutoGLM 的重试机制是保障任务稳定性与资源效率的关键。网络波动、模型服务短暂不可用或请求超时等问题不可避免&#xff0c;若不加以控制&#xff0c;可能导致任务失…

作者头像 李华