python——元组、列表、字典的综合利用实践
《元组、列表、字典综合利用实验》2025年11月6日
一、常见功能及用法
关于元组、列表、字典的详细讲解,包含功能、语法及三者对比表:
1.元组(Tuple)
定义:有序、不可修改的元素集合,元素可重复,支持多种数据类型。基本语法:用小括号 () 包裹,元素间用逗号分隔,如 t = (1, "a", True)。
| 功能 | 语法示例 | 说明 | 常见使用场景 |
|---|---|---|---|
| 创建元组 | t = (1, 2, 3) | 空元组:t = ();单元素需加逗号:t = (5,) | 存储固定不变的数据(如配置信息) |
| 访问元素 | t[0] | 通过索引访问(从 0 开始) | 获取固定位置的信息 |
| 切片(获取子元组) | t[1:3] | 获取索引 1 到 2 的元素(左闭右开) | 提取部分数据 |
| 拼接元组 | t1 + t2 | 生成新元组(原元组不变) | 合并固定数据 |
| 重复元素 | t * 2 | 元素重复 2 次(原元组不变) | 快速生成重复数据 |
| 计算长度 | len(t) | 返回元素个数 | 判断数据量大小 |
| 检查元素是否存在 | x in t | 存在返回True,否则False | 验证数据是否包含目标值 |
2.列表(List)
定义:有序、可修改的元素集合,元素可重复,支持多种数据类型。基本语法:用中括号 [] 包裹,元素间用逗号分隔,如 l = [1, "a", True]。
| 功能 | 语法示例 | 说明 | 常见使用场景 |
|---|---|---|---|
| 创建列表 | l = [1, 2, 3] | 空列表:l = [] | 存储动态变化的数据(如学生列表) |
| 访问元素 | l[0] | 通过索引访问(从 0 开始) | 获取指定位置元素 |
| 修改元素 | l[0] = 10 | 直接通过索引赋值修改 | 更新数据 |
| 切片(获取子列表) | l[1:3] | 获取索引 1 到 2 的元素(左闭右开) | 提取部分数据 |
| 添加元素(末尾) | l.append(4) | 在列表末尾添加新元素 | 动态增加数据(如新增学生) |
| 插入元素(指定位置) | l.insert(1, 5) | 在索引 1 处插入元素 5 | 在指定位置添加数据 |
| 删除元素(指定值) | l.remove(2) | 删除第一个匹配的值 2 | 移除特定数据 |
| 删除元素(指定索引) | del l[0] | 删除索引 0 处的元素 | 按位置移除数据 |
| 弹出元素(最后一个) | l.pop() | 移除并返回最后一个元素 | 栈 / 队列操作 |
| 清空列表 | l.clear() | 移除所有元素(列表变为空) | 重置列表数据 |
| 反转列表 | l.reverse() | 原地反转元素顺序 | 倒序排列数据 |
| 排序 | l.sort() | 原地升序排序(默认);reverse=True降序 | 对数据排序 |
| 计算长度 | len(l) | 返回元素个数 | 判断数据量大小 |
| 检查元素是否存在 | x in l | 存在返回True,否则False | 验证数据是否包含目标值 |
3.字典(Dictionary)
定义:无序(Python 3.7+ 有序)、键值对形式的集合,键唯一且不可变,值可修改。基本语法:用大括号 {} 包裹,键值对用 key: value 表示,如 d = {"name": "A", "age": 18}。
| 功能 | 语法示例 | 说明 | 常见使用场景 |
|---|---|---|---|
| 创建字典 | d = {"name": "A", "ID": "1"} | 空字典:d = {};dict() 构造:d = dict(name="A") | 存储关联数据(如学生信息) |
| 访问值 | d["name"] 或 d.get("name") | [] 访问不存在的键会报错;get() 返回None(或指定默认值) | 获取键对应的 value |
| 修改值 | d["score"] = 90 | 键存在则修改值,不存在则新增键值对 | 更新数据(如修改学生成绩) |
| 删除键值对 | del d["ID"] | 删除指定键对应的键值对 | 移除数据 |
| 清空字典 | d.clear() | 移除所有键值对(字典变为空) | 重置字典数据 |
| 获取所有键 | d.keys() | 返回键的列表(可迭代) | 遍历所有键 |
| 获取所有值 | d.values() | 返回值的列表(可迭代) | 遍历所有值 |
| 获取所有键值对 | d.items() | 返回 (key, value) 元组的列表 | 同时遍历键和值 |
| 计算长度 | len(d) | 返回键值对的数量 | 判断数据量大小 |
| 检查键是否存在 | key in d | 存在返回True,否则False | 验证是否包含目标键 |
4.元组、列表、字典三者对比表
| 特性 | 元组(Tuple) | 列表(List) | 字典(Dictionary) |
|---|---|---|---|
| 符号 | () | [] | {} |
| 元素形式 | 单个值(如 1, "a") | 单个值(如 1, "a") | 键值对(key: value) |
| 可修改性 | 不可修改(元素 / 长度固定) | 可修改(增删改元素) | 可修改(增删改键值对) |
| 有序性 | 有序(索引访问) | 有序(索引访问) | Python 3.7+ 有序(按插入顺序) |
| 索引方式 | 数字索引(t[0]) | 数字索引(l[0]) | 键索引(d["key"]) |
| 重复元素 | 允许重复元素 | 允许重复元素 | 键不可重复(值可重复) |
| 内存占用 | 较小(不可变,存储更紧凑) | 较大(需预留修改空间) | 较大(需存储键值对关联关系) |
| 常用场景 | 存储固定数据(如班级信息、坐标) | 存储动态数据(如学生列表、日志) | 存储关联数据(如用户信息、配置) |
| 核心优势 | 安全性高(防止误修改)、速度快 | 灵活性高(支持动态操作) | 查询效率高(通过键快速访问值) |
总结:
- 元组适合存储 “只读” 数据,保证数据安全性;
- 列表适合存储 “动态变化” 的序列数据,支持灵活增删改;
- 字典适合存储 “键值关联” 的数据,通过键快速查询值,是处理结构化信息的首选。
二、实验要求
学生信息管理与成绩分析
任务要求:
-
定义一个包含若干学生信息的列表,每个学生信息字段包括
姓名、学号、成绩。 -
记录班级基本信息(班级名、课程名、教师名)。
-
编写函数:
show_students(data):输出所有学生信息;get_average_score(data):计算平均成绩。
-
实现学生信息的添加、修改与删除操作。
-
输出成绩最高和最低的学生信息。
三、设计思路及代码
1.初始信息表创建
对于学生信息采用列表[{字典}]的形式写入,为后续操作做准备
使用元组记录班级基本信息
2.具体功能实现
展示列表功能:
使用for循环,逐行打印列表中的每一个字典信息,为保持美观采用字符串格式化输出
- 格式化输出:
print(f"name:{i['name']:<6}")中f-string结合对齐符(<6左对齐占 6 位)美化输出。
计算平均值功能:
使用for循环加值类型转换int()获取数值、len()函数获取长度,在利用sum()函数进行求和,最终实现平均值转化
查询信息功能:
利用for循环进行遍历的同时获取索引值(利用enumerate()内置函数简化过程),然后进行匹配输出
enumerate()是一个内置函数,主要用于将一个可迭代对象(如列表、元组、字符串等)转换为一个枚举对象,同时返回元素的索引(位置)和元素值本身。enumerate()的基本作用当你需要遍历一个可迭代对象(比如列表student)时,不仅想获取每个元素的值,还想知道该元素在对象中的位置(索引),enumerate()就能简化这个过程。
添加信息功能:
利用字符串分割.split()简化输入过程以及.append增填元素
- 字符串分割:
info.split()将输入的学生信息按空格分割为列表,便于提取name、ID、score。
删除信息功能:
遵循先查询后删除的机制,调用find函数进行匹配,然后利用del 删除元素
更新信息功能:
先匹配后更改
查找最高功能:
提取原列表所有成绩元素、创建新的元组,利用for循环进行比较的同时,对最大值进行索引保存。
查找最低功能:
同上
交互菜单设计:
Menu() 函数通过 while 循环实现菜单持续显示,用户输入数字选择功能。
用 if-elif 匹配用户选择,调用对应的功能函数,实现交互逻辑。
逻辑串联:
依赖关系:修改 / 删除功能依赖于查找功能(先查后改 / 删)。
反馈机制:每个操作后输出结果(如 “添加成功”“新学生列表”),增强用户体验。
四、代码中用到的知识总结
1. 数据结构
- 列表(List):用于存储学生信息(
student列表),支持动态添加、删除、修改元素(如student.append()、del student[i])。 - 字典(Dictionary):每个学生信息用字典表示(如
{"name": "A", "ID": "1", "score": "32"}),通过键(name/ID/score)快速访问值。 - 元组(Tuple):用于存储班级信息(
class_info),元组不可修改,适合存储固定信息。
2. 函数定义与调用
- 自定义函数:如
show_student()、get_average_score()等,将功能模块化,提高代码复用性。 - 函数参数与返回值:例如
find_student(student)接收学生列表,返回找到的学生索引(index)或-1(未找到)。
3. 流程控制
- 循环:
for循环:遍历学生列表(for i in student)、遍历索引(for index, i in enumerate(student))。while循环:菜单交互(while chose != 9),实现程序持续运行直到用户选择退出。
- 条件判断:
if-elif-else结构处理菜单选择(如if chose == 1)、查找学生时的匹配判断(if i['ID'] == pivot)。
4. 字符串操作
- 格式化输出:
print(f"name:{i['name']:<6}")中f-string结合对齐符(<6左对齐占 6 位)美化输出。 - 字符串分割:
info.split()将输入的学生信息按空格分割为列表,便于提取name、ID、score。
5. 输入输出
input():获取用户输入(如查找学生的ID、新增学生信息等)。print():输出信息(学生列表、提示语、计算结果等)。
6. 数值计算
- 类型转换:
int(i['score'])将字符串类型的成绩转为整数,用于计算平均分、最高分、最低分。 - 求和与除法:
sum(int(i['score']) for i in student)计算总分,除以学生数量得到平均分。
五、最终代码
#学生列表(元组(字典))
student = [{"name": "A", "ID": "1", "score": "32"},{"name": "B", "ID": "2", "score": "42"},{"name": "C", "ID": "3", "score": "64"},{"name": "D", "ID": "4", "score": "54"}
]
#班级信息(元组)
class_info = ("Class1","math","Mr.Z")
#编写函数:
# * `show_students(data)`:输出所有学生信息;循环打印学生信息
def show_student(student,class_info):print(f"-----The student's info of {class_info}-----")for i in student:print(f"- name:{i['name']:<6} ID:{i['ID']:<5} score:{i['score']:<3} -")print("-"*58)print("")
# * `get_average_score(data)`:计算平均成绩。统计学生成绩调用v函数
def get_average_score(student):average_score= sum(int(i['score']) for i in student) / len(student)print(f'The average:{average_score}\n')
# 实现学生信息的添加、修改与删除操作。 先查找后修改
def find_student(student):pivot = input("Enter you want to find the student's ID:")for index, i in enumerate(student): #此处的index充当计数器、索引的功能,i是用于查找匹配的if i['ID'] == pivot:print(f"----> name: {i['name']} ID: {i['ID']} score: {i['score']}\n")return indexprint("Student not found")return -1 #为后续调用准备
def add_student(student):info = input("Please enter the student's name,id and score (separated by spaces):")name, id, score = info.split()# 构造字典并添加到列表student.append({"name": name, "ID": id, "score": score})print(f"Student:{name} has been successfully added ")print("\nThe new student's info:")show_student(student, class_info)
def change_student(student):print("Please search for the student before change")i = int(find_student(student))if i == -1:print("End")else:newscore = input("Please enter the new score of the student you want to change :")student[i]["score"] = newscoreprint("The student's score has been successfully changed")print("\nThe new student's info:")show_student(student, class_info)
def delete_student(student):print("Please search for the student before deletion")i = int(find_student(student))if i == -1:print("End")else:del student[i]print("the student has ben successfully deleted")print("\nThe new student's info:")show_student(student,class_info)
# 输出成绩最高和最低的学生信息。 查找
def max_score(student):
# 创建一个空列表,然后把他们一次加入进去,然后开始比较,遇到大的了就存当前的索引值allscore =[]maxscore = 0index = -1 #索引值for i in student:allscore.append(int(i['score']))for m in range(len(allscore)):if allscore[m] > maxscore:maxscore = allscore[m]index = mprint(f"The maxscore is: {maxscore}")print(student[index])
def min_score(student):
# 创建一个空列表,然后把他们一次加入进去,然后开始比较,遇到大的了就存当前的索引值allscore =[]minscore = 100index = -1 #索引值for i in student:allscore.append(int(i['score']))for m in range(len(allscore)):if allscore[m] < minscore:minscore = allscore[m]index = mprint(f"The minscore is: {minscore}")print(student[index])
def Menu():# print("-------Student Info System Menu-------\n"# "1. Show Student Information\n"# "2. Add Student Information\n"# "3. Search Student Information\n"# "4. Delete Student Information\n"# "5. Update Student Score\n"# "6. Show Highest Score Student\n"# "7. Show Lowest Score Student\n"# "8. Get Average Score\n"# "9. Exit System\n"# "---------------------------------------\n")chose = 0while chose != 9:print("-------Student Info System Menu-------\n""1. Show Student Information\n""2. Add Student Information\n""3. Search Student Information\n""4. Delete Student Information\n""5. Update Student Score\n""6. Show Highest Score Student\n""7. Show Lowest Score Student\n""8. Get Average Score\n""9. Exit System\n""---------------------------------------\n")chose = int(input("Please Choose the Service You Need--->"))if chose == 1:print("Show Student Information\n")show_student(student,class_info)elif chose == 2:print("Add Student Information\n")add_student(student)elif chose == 3:print("Search Student Information\n")find_student(student)elif chose == 4:print("Delete Student Information\n")delete_student(student)elif chose == 5:print("Update Student Score\n")change_student(student)elif chose == 6:print("Show Highest Score Student\n")max_score(student)elif chose == 7:print("Show Lowest Score Student\n")min_score(student)elif chose == 8:print("Get Average Score\n")get_average_score(student)elif chose == 9:print("Exit System\n")else:print("No Such Option in the Menu\n")
Menu()
六、编写过程中遇到的问题
编写查询功能时
最开始的逻辑为
def find_student(student):pivot = input("Enter you want to find the student's ID:")for i in (student):if i['ID'] == pivot:print(f"----> name: {i['name']} ID: {i['ID']} score: {i['score']}\n")return i-1else:print("Student not found")return -1
此时出现了一个逻辑错误:
在每一次循环的工程中我都会有返回值,导致我后续编写其他功能进行调用时候出现了和预想输出值不一的结果。
后续进行了逻辑调整:
i在列表student中循环遍历字典:
当i列表的键'ID'和pivot等价时:
输出当前字典
返回当前i-1的值
否则:
输出未找到
返回为-1
修改为
i在列表student中循环遍历字典,同时进行索引记数:
当i列表的键'ID'和pivot等价时:
输出当前字典
返回当前index索引的值
返回为-1
输出未找到
