第30集:数据结构综合练习
本集学习目标
- 综合运用字符串、列表、元组、字典、集合
- 掌握数据结构的实际应用
- 学会数据清洗和处理
- 掌握数据分析的基本方法
- 通过完整项目巩固所学知识
项目介绍
本集我们将完成一个学生成绩管理系统,综合运用前面学到的所有数据结构知识。
系统功能
- 添加学生信息
- 查询学生信息
- 修改学生信息
- 删除学生信息
- 统计成绩信息
- 成绩排序
- 查找优秀学生
- 数据导出
完整代码
版本1:基础版本
# 学生成绩管理系统(基础版本)
students = []
# 添加学生
def add_student(name, age, scores):
student = {
"name": name,
"age": age,
"scores": scores
}
students.append(student)
print(f"已添加学生:{name}")
# 查询学生
def find_student(name):
for student in students:
if student["name"] == name:
return student
return None
# 显示所有学生
def show_all_students():
print("\n学生列表:")
for student in students:
print(f"姓名:{student['name']},年龄:{student['age']},成绩:{student['scores']}")
# 计算平均分
def calculate_average(scores):
return sum(scores) / len(scores)
# 主程序
while True:
print("\n" + "=" * 50)
print("学生成绩管理系统")
print("=" * 50)
print("1. 添加学生")
print("2. 查询学生")
print("3. 显示所有学生")
print("4. 退出")
print("=" * 50)
choice = input("请选择:")
if choice == "1":
name = input("姓名:")
age = int(input("年龄:"))
scores = list(map(int, input("成绩(空格分隔):").split()))
add_student(name, age, scores)
elif choice == "2":
name = input("要查询的学生姓名:")
student = find_student(name)
if student:
print(f"姓名:{student['name']},年龄:{student['age']}")
print(f"成绩:{student['scores']}")
avg = calculate_average(student['scores'])
print(f"平均分:{avg:.2f}")
else:
print("未找到该学生")
elif choice == "3":
show_all_students()
elif choice == "4":
print("感谢使用!")
break版本2:增强版本
# 学生成绩管理系统(增强版本)
import json
class StudentManager:
def __init__(self):
self.students = []
def add_student(self, name, age, scores):
"""添加学生"""
student = {
"name": name,
"age": age,
"scores": scores,
"average": sum(scores) / len(scores)
}
self.students.append(student)
print(f"已添加学生:{name}")
def find_student(self, name):
"""查找学生"""
for student in self.students:
if student["name"] == name:
return student
return None
def update_student(self, name, new_scores):
"""更新学生成绩"""
student = self.find_student(name)
if student:
student["scores"] = new_scores
student["average"] = sum(new_scores) / len(new_scores)
print(f"已更新{name}的成绩")
else:
print("未找到该学生")
def delete_student(self, name):
"""删除学生"""
for i, student in enumerate(self.students):
if student["name"] == name:
del self.students[i]
print(f"已删除学生:{name}")
return
print("未找到该学生")
def show_all(self):
"""显示所有学生"""
if not self.students:
print("暂无学生信息")
return
print("\n学生列表:")
for i, student in enumerate(self.students, 1):
print(f"{i}. 姓名:{student['name']},年龄:{student['age']}")
print(f" 成绩:{student['scores']}")
print(f" 平均分:{student['average']:.2f}")
def sort_by_average(self, reverse=False):
"""按平均分排序"""
self.students.sort(key=lambda x: x["average"], reverse=reverse)
print("已排序")
def find_excellent(self, threshold=90):
"""查找优秀学生"""
excellent = [s for s in self.students if s["average"] >= threshold]
if excellent:
print(f"\n平均分≥{threshold}的学生:")
for student in excellent:
print(f" {student['name']}:{student['average']:.2f}")
else:
print(f"没有平均分≥{threshold}的学生")
def statistics(self):
"""统计信息"""
if not self.students:
print("暂无学生信息")
return
averages = [s["average"] for s in self.students]
print("\n统计信息:")
print(f" 学生人数:{len(self.students)}")
print(f" 平均分最高:{max(averages):.2f}")
print(f" 平均分最低:{min(averages):.2f}")
print(f" 全班平均:{sum(averages) / len(averages):.2f}")
def export_to_json(self, filename):
"""导出为JSON"""
with open(filename, 'w', encoding='utf-8') as f:
json.dump(self.students, f, ensure_ascii=False, indent=2)
print(f"已导出到:{filename}")
# 主程序
def main():
manager = StudentManager()
while True:
print("\n" + "=" * 50)
print("学生成绩管理系统")
print("=" * 50)
print("1. 添加学生")
print("2. 查询学生")
print("3. 更新成绩")
print("4. 删除学生")
print("5. 显示所有学生")
print("6. 按平均分排序")
print("7. 查找优秀学生")
print("8. 统计信息")
print("9. 导出数据")
print("0. 退出")
print("=" * 50)
choice = input("请选择:")
if choice == "1":
name = input("姓名:")
age = int(input("年龄:"))
scores = list(map(int, input("成绩(空格分隔):").split()))
manager.add_student(name, age, scores)
elif choice == "2":
name = input("要查询的学生姓名:")
student = manager.find_student(name)
if student:
print(f"姓名:{student['name']}")
print(f"年龄:{student['age']}")
print(f"成绩:{student['scores']}")
print(f"平均分:{student['average']:.2f}")
else:
print("未找到该学生")
elif choice == "3":
name = input("要更新的学生姓名:")
scores = list(map(int, input("新成绩(空格分隔):").split()))
manager.update_student(name, scores)
elif choice == "4":
name = input("要删除的学生姓名:")
manager.delete_student(name)
elif choice == "5":
manager.show_all()
elif choice == "6":
reverse = input("降序排序?(y/n): ").lower() == 'y'
manager.sort_by_average(reverse)
elif choice == "6":
threshold = int(input("优秀分数线:") or "90")
manager.find_excellent(threshold)
elif choice == "8":
manager.statistics()
elif choice == "9":
filename = input("文件名(默认:students.json):") or "students.json"
manager.export_to_json(filename)
elif choice == "0":
print("感谢使用!")
break
if __name__ == "__main__":
main()数据结构应用场景
场景1:数据清洗
# 原始数据(可能有重复)
raw_data = [
{"name": "张三", "age": 18},
{"name": "李四", "age": 19},
{"name": "张三", "age": 18}, # 重复
]
# 去重(使用集合)
unique_names = {d["name"] for d in raw_data}
clean_data = [d for d in raw_data if d["name"] in unique_names]
print(clean_data)场景2:数据统计
# 学生成绩
scores = [85, 92, 78, 95, 88, 72, 90]
# 使用字典统计等级分布
grade_count = {"A": 0, "B": 0, "C": 0}
for score in scores:
if score >= 90:
grade_count["A"] += 1
elif score >= 80:
grade_count["B"] += 1
else:
grade_count["C"] += 1
print(grade_count)场景3:数据分析
# 销售数据
sales = [
{"product": "A", "sales": 100},
{"product": "B", "sales": 150},
{"product": "C", "sales": 120}
]
# 排序(按销量降序)
sorted_sales = sorted(sales, key=lambda x: x["sales"], reverse=True)
# 找出最高销量
top_product = sorted_sales[0]
print(f"最高销量:{top_product}")本集小结
- 综合运用字符串、列表、字典等数据结构
- 字典适合存储键值对数据
- 列表适合存储有序数据
- 集合适合去重
- 字符串用于文本处理
- 类可以封装数据和方法
- JSON用于数据导出
- 排序使用
sort()或sorted() - 列表推导式简化代码
- lambda用于匿名函数
课后练习
练习1:去重并排序
对列表[5,3,8,1,6,3,8,5]去重并排序。
练习2:单词统计
统计字符串中每个单词出现的次数。
练习3:数据分组
按成绩等级将学生分组。
练习4:查找重复
找出列表中的重复元素。
练习5:数据合并
合并多个字典的值。
学习总结
恭喜你完成了第21-30集的学习!你已经掌握了:
- 字符串基础操作和常用方法
- 列表基础操作和常用方法
- 元组基础操作
- 字典基础操作和常用方法
- 集合基础操作
- 数据类型转换
- 综合应用能力
继续加油!下一阶段将学习函数、模块等更高级的知识!