第30集:数据结构综合练习

本集学习目标

  • 综合运用字符串、列表、元组、字典、集合
  • 掌握数据结构的实际应用
  • 学会数据清洗和处理
  • 掌握数据分析的基本方法
  • 通过完整项目巩固所学知识

项目介绍

本集我们将完成一个学生成绩管理系统,综合运用前面学到的所有数据结构知识。

系统功能

  1. 添加学生信息
  2. 查询学生信息
  3. 修改学生信息
  4. 删除学生信息
  5. 统计成绩信息
  6. 成绩排序
  7. 查找优秀学生
  8. 数据导出

完整代码

版本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}")

本集小结

  1. 综合运用字符串、列表、字典等数据结构
  2. 字典适合存储键值对数据
  3. 列表适合存储有序数据
  4. 集合适合去重
  5. 字符串用于文本处理
  6. 可以封装数据和方法
  7. JSON用于数据导出
  8. 排序使用sort()sorted()
  9. 列表推导式简化代码
  10. lambda用于匿名函数

课后练习

练习1:去重并排序

对列表[5,3,8,1,6,3,8,5]去重并排序。

练习2:单词统计

统计字符串中每个单词出现的次数。

练习3:数据分组

按成绩等级将学生分组。

练习4:查找重复

找出列表中的重复元素。

练习5:数据合并

合并多个字典的值。

学习总结

恭喜你完成了第21-30集的学习!你已经掌握了:

  • 字符串基础操作和常用方法
  • 列表基础操作和常用方法
  • 元组基础操作
  • 字典基础操作和常用方法
  • 集合基础操作
  • 数据类型转换
  • 综合应用能力

继续加油!下一阶段将学习函数、模块等更高级的知识!

« 上一篇 数据类型转换 下一篇 » 函数定义与调用