news 2026/10/5 1:18:40

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/10/3 23:10:00

企业组织架构优化方案 在线绘图工具

在企业组织架构优化过程中&#xff0c;有效的在线绘图工具能够帮助企业快速、直观地绘制和调整组织架构图。本文将介绍几款国内外知名的在线绘图工具&#xff0c;帮助企业选择最适合的工具。以下是详细内容&#xff1a; 良功绘图网站 (https://www.lghuitu.com ) 是一款功能强…

作者头像 李华
网站建设 2026/10/4 12:38:50

计算机毕设Java攀枝花市学信教育管理平台 基于Java的攀枝花市学信教育信息管理系统设计与实现 Java技术在攀枝花市学信教育管理平台中的应用研究

计算机毕设Java攀枝花市学信教育管理平台v7rkj9&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 随着互联网技术的飞速发展&#xff0c;教育信息化已成为推动教育现代化的重要力…

作者头像 李华
网站建设 2026/10/2 16:23:17

别再手动调试了!Open-AutoGLM自动识别控件状态的高效实现路径

第一章&#xff1a;别再手动调试了&#xff01;Open-AutoGLM控件状态精准识别的变革意义在现代GUI自动化测试中&#xff0c;控件状态的准确识别是实现高稳定性脚本的核心前提。传统方法依赖坐标定位或静态属性匹配&#xff0c;极易因界面微调而失效。Open-AutoGLM 的引入彻底改…

作者头像 李华
网站建设 2026/10/3 11:08:15

FCKEditor分享Word图片转存服务器路径配置案例

&#x1f468;&#x1f4bb; Word图片一键转存功能开发日记 &#x1f50d; 寻找解决方案的漫漫长路 作为一个即将毕业的吉林软件工程专业大三学生&#xff0c;我最近在给我的CMS新闻管理系统添加一个超实用的功能 - Word文档一键粘贴并自动上传图片&#xff01;这简直是内容编…

作者头像 李华
网站建设 2026/10/4 0:34:04

Excalidraw与Thanos监控长期存储架构图

Excalidraw 与 Thanos&#xff1a;用视觉语言解构云原生监控架构 在一次深夜的线上故障复盘会上&#xff0c;团队盯着屏幕里那张密密麻麻的监控架构图——标准矩形框、规整连线、层层嵌套的组件&#xff0c;没人能一口气讲清楚数据到底从哪来、往哪去。突然有人提议&#xff1…

作者头像 李华
网站建设 2026/10/4 22:44:55

Excalidraw手绘白板神器:AI赋能下的技术架构图一键生成

Excalidraw&#xff1a;当手绘白板遇上AI&#xff0c;技术图一键生成的实践之路 在一次远程架构评审会议中&#xff0c;团队正为如何快速呈现微服务调用链而发愁。有人提议&#xff1a;“要不我们画个图&#xff1f;”——话音刚落&#xff0c;另一人苦笑&#xff1a;“又要开V…

作者头像 李华