Python 提供了多种数据容器来存储和操作数据,理解它们的特性差异对于选择合适的数据结构至关重要。
五大容器特性对比
| 特性 | 字符串 (str) | 列表 (list) | 元组 (tuple) | 集合 (set) | 字典 (dict) |
|---|---|---|---|---|---|
| 有序性 | 有序 | 有序 | 有序 | 无序 | 有序(3.7+) |
| 重复元素 | 允许 | 允许 | 允许 | 不允许 | key不允许 |
| 可变性 | 不可变 | 可变 | 不可变 | 可变 | 可变 |
| 索引访问 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
| 切片操作 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
| 使用场景 | 文本处理 | 有序可重复数据集合 | 固定数据记录 | 去重数据集合 | 键值对 |
各容器特点详解
字符串 (str)
- 有序:元素按顺序排列
- 不可变:创建后不能修改
- 支持索引和切片:可以访问特定位置的元素
- 典型用途:文本处理、字符操作
s = "Hello World"
print(s[0]) # H
print(s[0:5]) # Hello列表 (list)
- 有序:元素按插入顺序排列
- 可变:可以添加、删除、修改元素
- 允许重复:可以包含相同的元素
- 支持索引和切片:灵活的数据访问方式
- 典型用途:需要频繁增删改的有序数据
lst = [1, 2, 3, 2, 1]
lst.append(4) # [1, 2, 3, 2, 1, 4]
lst[0] = 10 # [10, 2, 3, 2, 1, 4]元组 (tuple)
- 有序:元素按插入顺序排列
- 不可变:创建后不能修改
- 允许重复:可以包含相同的元素
- 支持索引和切片:但不能修改
- 典型用途:固定数据记录、函数返回多个值
t = (1, 2, 3)
print(t[0]) # 1
# t[0] = 10 # 报错:tuple不支持修改集合 (set)
- 无序:元素没有固定顺序
- 可变:可以添加、删除元素
- 不允许重复:自动去重
- 不支持索引和切片:只能通过值来判断是否存在
- 典型用途:去重、集合运算(交集、并集、差集)
s = {1, 2, 3, 2, 1}
print(s) # {1, 2, 3} 自动去重
s.add(4) # {1, 2, 3, 4}字典 (dict)
- 有序(Python 3.7+):按插入顺序排列
- 可变:可以增删改键值对
- Key不允许重复:相同的Key会覆盖
- 不支持索引和切片:通过Key访问Value
- 典型用途:键值对数据、JSON数据处理
d = {"name": "Alice", "age": 25}
print(d["name"]) # Alice
d["city"] = "Beijing" # 添加新键值对如何选择数据容器
| 需求场景 | 推荐容器 | |
|---|---|---|
| 存储文本数据 | 字符串 (str) | |
| 需要频繁增删改的有序数据 | 列表 (list) | |
| 固定不变的数据记录 | 元组 (tuple) | |
| 需要自动去重的数据 | 集合 (set) | |
| 需要通过键快速查找值 | 字典 (dict) |
总结口诀
- 字符串:文本处理用它
- 列表:能变能重复,有序可索引
- 元组:固定不变,安全可靠
- 集合:去重专家,无序独特
- 字典:键值配对,查找飞快
综合练习:教务管理系统 ❌
批改(2026-09-28):❌「修改学生信息」(case 2)只存了
chinese、math,漏了english(第 95-98 行),改完再查询/列出/统计会直接崩:实测第 135、150、169 行都抛KeyError: 'english',应补上"english": english_score。另外三处:① 第 13 行ts = """"欢迎使用教务管理系统多打了一个引号,菜单开头多输出了一个";② 菜单只在程序启动时打印一次,题面第三步要求"每次循环显示菜单";③ 统计功能只算了平均分,缺题面要求的最高分/最低分(max()、min())。其余流程正常:添加(含重名提示)、删除、查询、列出、非法操作、退出都跑通,数据保存正确。
这个案例综合运用了字典、列表、循环、条件语句等知识点,是一个很好的复习练习。
案例需求
开发一个教务管理系统,可以维护和管理学员的成绩信息:
- 添加学生信息:录入学生姓名、语文、数学、英语成绩
- 修改学生信息:根据姓名修改成绩
- 删除学生信息:根据姓名删除学生
- 查询学生信息:根据姓名查询成绩
- 列出所有学生:遍历所有学生信息
- 统计班级成绩:最高分、最低分、平均分
- 退出系统
分步引导
第一步:显示菜单
- 用
print打印菜单 - 提示:可以用多行字符串
""" """
第二步:用字典存储学生信息
- 创建空字典
student_scores = {} - 格式:
{姓名: {"chinese": 语文, "math": 数学, "english": 英语}}
第三步:用 while 循环实现主循环
- 用
while True创建无限循环 - 每次循环显示菜单,获取用户输入
- 用
match...case匹配用户选择
第四步:实现添加学生功能
- 获取学生姓名:
input("请输入学生姓名: ") - 检查学生是否已存在:
if student_name in student_scores: - 如果不存在,获取各科成绩并保存
第五步:实现修改学生功能
- 检查学生是否存在:
if student_name not in student_scores: - 如果不存在,用
continue跳过 - 如果存在,获取新成绩并更新
第六步:实现删除学生功能
- 检查学生是否存在
- 如果存在,用
del删除:del student_scores[student_name]
第七步:实现查询学生功能
- 检查学生是否存在
- 如果存在,用 f-string 打印学生信息
第八步:实现列出所有学生功能
- 用 for 循环遍历字典:
for name, scores in student_scores.items(): - 打印每个学生的信息
第九步:实现统计班级成绩功能
- 创建空列表收集各科成绩
- 用
max()、min()、sum()、len()计算统计值 - 打印统计结果
第十步:实现退出系统功能
- 打印 "Bye ~"
- 用
break跳出循环
涉及知识点
| 知识点 | 在代码中的应用 |
|---|---|
| 字典 | 存储学生信息 student_scores |
| 列表 | 收集各科成绩 chinese_scores |
| while 循环 | 持续显示菜单 |
| for 循环 | 遍历学生信息 |
| if 判断 | 检查学生是否存在 |
| match...case | 匹配用户选择 |
| 内置函数 | max()、min()、sum()、len() |
| 字符串格式化 | f-string 输出信息 |
in 运算符 | 判断学生是否存在 |
del 语句 | 删除学生信息 |
参考答案
# 菜单显示
menu = """
========== 【教务管理系统】 ==========
1. 添加学生信息 2. 修改学生信息
3. 删除学生信息 4. 查询学生信息
5. 列出所有学生 6. 统计班级成绩
7. 退出系统
====================================
"""
print("欢迎使用教务管理系统 ~")
# 用字典存储所有学生信息
student_scores = {}
while True:
# 显示菜单
print(menu)
# 获取用户选择
choice = input("请选择要执行的操作(1-7): ")
match choice:
case "1": # 添加学生信息
student_name = input("请输入学生姓名: ")
# 检查学生是否已存在
if student_name in student_scores:
print("该学生已存在, 请重新选择 ~")
else:
chinese_score = float(input("请输入语文成绩: "))
math_score = float(input("请输入数学成绩: "))
english_score = float(input("请输入英语成绩: "))
student_scores[student_name] = {
"chinese": chinese_score,
"math": math_score,
"english": english_score
}
print("学生信息添加完毕 ~")
case "2": # 修改学生信息
student_name = input("请输入要修改的学生姓名: ")
# 检查学生是否存在
if student_name not in student_scores:
print("该学生不存在, 请重新选择 ~")
continue
chinese_score = float(input("请输入语文成绩: "))
math_score = float(input("请输入数学成绩: "))
english_score = float(input("请输入英语成绩: "))
student_scores[student_name] = {
"chinese": chinese_score,
"math": math_score,
"english": english_score
}
print("学生信息修改完毕 ~")
case "3": # 删除学生信息
student_name = input("请输入要删除的学生姓名: ")
# 检查学生是否存在
if student_name not in student_scores:
print("该学生不存在, 请重新选择 ~")
else:
del student_scores[student_name]
print("学生信息删除完毕 ~")
case "4": # 查询学生信息
student_name = input("请输入要查询的学生姓名: ")
# 检查学生是否存在
if student_name not in student_scores:
print("该学生不存在, 请重新选择 ~")
else:
info = student_scores[student_name]
print(f"学生姓名: {student_name}")
print(f"语文成绩: {info['chinese']}")
print(f"数学成绩: {info['math']}")
print(f"英语成绩: {info['english']}")
case "5": # 列出所有学生
if not student_scores:
print("系统中暂无学生信息 ~")
else:
print("===== 所有学生信息 =====")
for name, scores in student_scores.items():
print(f"{name}: 语文{scores['chinese']}, 数学{scores['math']}, 英语{scores['english']}")
print("========================")
case "6": # 统计班级成绩
if not student_scores:
print("系统中暂无学生信息,请先添加学生 ~")
continue
# 收集所有成绩
chinese_scores = []
math_scores = []
english_scores = []
for scores in student_scores.values():
chinese_scores.append(scores['chinese'])
math_scores.append(scores['math'])
english_scores.append(scores['english'])
# 计算统计值
print("===== 班级成绩统计 =====")
print(f"语文 - 最高分: {max(chinese_scores)}, 最低分: {min(chinese_scores)}, 平均分: {sum(chinese_scores)/len(chinese_scores):.2f}")
print(f"数学 - 最高分: {max(math_scores)}, 最低分: {min(math_scores)}, 平均分: {sum(math_scores)/len(math_scores):.2f}")
print(f"英语 - 最高分: {max(english_scores)}, 最低分: {min(english_scores)}, 平均分: {sum(english_scores)/len(english_scores):.2f}")
print("========================")
case "7": # 退出系统
print("Bye ~")
break
case _: # 其他情况
print("非法操作, 不支持!!!")相关
练习题
一、知识回顾(读完直接做下面的实践题)
- 五大容器对号入座:文本处理用字符串(str);有序、可重复、能频繁增删改用列表(list);固定不变的数据记录用元组(tuple);需要自动去重用集合(set);键值对(JSON 数据)用字典(dict)。
- 有序性:字符串、列表、元组都有序,字典从 Python 3.7 版本起也按插入顺序排列,只有集合是真正无序的。
- 索引与切片:支持索引和切片的是字符串、列表、元组;不支持的是集合、字典(只能通过值判断是否存在,或通过键取值)。
- 可变性:字符串和元组创建后不能修改;列表、集合、字典可以增删改。
- 重复元素:字符串、列表、元组允许重复;集合会自动去重;字典的键(key)不允许重复,写重复的会覆盖。
- 集合的特点:元素无序、可变、不允许重复、不支持索引和切片;典型用途是去重与集合运算(交集、并集、差集)。
- 字典的特点:通过键(key)访问值,用
d[键] = 值可以添加新键值对;键不允许重复,典型用途是键值对数据与 JSON 数据处理。 - 口诀:列表——能变能重复、有序可索引;元组——固定不变、安全可靠;集合——去重专家、无序独特;字典——键值配对、查找飞快。
- 教务管理系统案例:学生信息整体用字典存(姓名 → 各科成绩的字典),各科成绩用列表收集;统计用内置函数 max、min、sum、len;菜单选择用 match...case 语句匹配;删除学生用 del 关键字。
二、概念自测
- 提示(先自己想,实在想不出再点开)
一级 · 思路:从"数据靠什么组织起来"想——靠位置还是靠元素本身;再想"没有固定顺序"的容器能不能说清第 0 个元素是谁
- 参考答案(做完再点开)
2-1 列表有序、允许重复,靠"位置"(索引)组织数据;集合无序、自动去重,靠"元素本身"组织数据。因为集合内部没有固定顺序,第 0 个元素是谁并不确定,所以不支持索引和切片,只能判断"某个值在不在里面"。
- 提示(先自己想,实在想不出再点开)
一级 · 思路:逐个场景抓关键词——"文本""随时增删改""固定不变的记录""去重""按编号快速查",再对回五大容器各自的强项
- 参考答案(做完再点开)
2-2 ① 字符串(str):文本处理就是它的主场;② 列表(list):需要频繁增删改、要有顺序;③ 元组(tuple):固定不变的一小串记录;④ 集合(set):自动去重;⑤ 字典(dict):键值对,按键查找飞快。
- 提示(先自己想,实在想不出再点开)
一级 · 思路:把四条逐一对照"表格里的四个特性"——有序性、重复元素、可变性、索引与切片,哪一条跟表格对不上就是错的
- 参考答案(做完再点开)
2-3 ① ✅ 对:元组有序,能按位置取值,但不能改;② ❌ 错:字典的键不允许重复,写重复的键会把原来的值覆盖掉(是"值被覆盖",不是"允许重复");③ ✅ 对:字符串有序、可索引可切片,但不可变;④ ❌ 错:两者都不支持索引和切片,集合靠值判断存在、字典靠键取值。
三、综合题
- 提示(先自己想,实在想不出再点开)
一级 · 思路:四种容器各有自己的字面量写法,先把同一批数字按四种写法各写一遍,再逐个打印对比 二级 · 方法:列表
[ ]、元组( )、集合{ }、字典{键: 值}三级 · 骨架:d = {1: 3, 2: 1, 3: 2, 4: 1, 5: 3}(序号做键、数字做值)- 参考答案(做完再点开)
python# 3-1 同一批数据,四种容器各存一遍 lst = [3, 1, 2, 1, 3] tup = (3, 1, 2, 1, 3) st = {3, 1, 2, 1, 3} d = {1: 3, 2: 1, 3: 2, 4: 1, 5: 3} print(lst) # [3, 1, 2, 1, 3] 有序、允许重复 print(tup) # (3, 1, 2, 1, 3) 有序、允许重复 print(st) # {1, 2, 3} 无序、自动去重(打印顺序可能不同) print(d) # {1: 3, 2: 1, 3: 2, 4: 1, 5: 3} 有序(3.7+)、键不重复- 提示(先自己想,实在想不出再点开)
一级 · 思路:要去重 → 谁天生不重复?固定不变的一小串记录 → 谁不可变?按键取值 → 谁是键值对? 二级 · 方法:集合字面量
{ }/ 元组字面量( )/ 字典字面量{键: 值};用in判断某个值在不在 三级 · 骨架:names = {"小王", "小李", "小王"}/book = ("Python入门与实践", "张三", 2024)/students = {"1001": "小王"}- 参考答案(做完再点开)
python# 3-2 ① 去重 → 集合 names = {"小王", "小李", "小王"} print(names) # {'小王', '小李'} print(len(names)) # 2 # 3-2 ② 固定信息 → 元组 book = ("Python入门与实践", "张三", 2024) print(book[0], book[1], book[2]) # 3-2 ③ 按键查找 → 字典 students = {"1001": "小王", "1002": "小李"} print(students["1001"]) # 小王 print("1002" in students) # True
