def process_student_data(student_info): """ 处理学生数据,进行类型转换和验证 参数: student_info: 字典,包含学生信息 格式: {"name": "张三", "age": "20", "score": "85.5", "is_passed": "true"} 返回: 处理后的字典,所有值都转换为正确的Python数据类型 如果数据无效,返回None 要求: - name: 转换为字符串,去除首尾空格 - age: 转换为整数,范围1-100 - score: 转换为浮点数,范围0.0-100.0 - is_passed: 转换为布尔值("true"/"false"字符串转为True/False) - 如果任何转换失败或超出范围,返回None """ try: required_fields = ["name", "age", "score", "is_passed"] # 校验是否字典中都存在字段 for field in required_fields: if field not in student_info: return None # 将姓名取出收尾空格 name = str(student_info["name"]).strip() if not name: return None # 将年龄转为整数,并检查范围 try: age = int(student_info["age"]) if not (1 <= age <= 100): return None except (ValueError, TypeError): return None # 分数转为浮点型 try: score = float(student_info["score"]) if not (0.0 < score < 100.0): return None except (ValueError, TypeError): return None # 处理is_passed is_passed = str(student_info["is_passed"]).lower() if is_passed == "true": is_passed = True elif is_passed == "false": is_passed = False else: is_passed = None return {"name": name, "age": age, "score": score, "is_passed": is_passed} except Exception: return None def calculate_and_format_grades(students): """ 计算学生成绩等级并格式化输出 参数: students: 学生信息列表,每个元素是字典 格式: [{"name": "张三", "score": 85.5}, ...] 返回: 格式化后的成绩报告字符串 要求: - 根据分数计算等级:>=90为A,>=80为B,>=70为C,>=60为D,<60为F - 计算平均分、最高分、最低分 - 统计各等级人数 - 使用f-string格式化输出,保留2位小数 - 输出格式要美观,包含表格样式 """ if not students: return "没有学生数据" def get_grade(score): if score >= 90: return "A" elif score >= 80: return "B" elif score >= 70: return "C" elif score >= 60: return "D" else: return "F" student_with_grade = [] # 学生添加等级 for student in students: score = student["score"] grade = get_grade(score) # 字段用**来进行解包 student_with_grade.append({**student, "grade": grade}) # 计算平均分 # 列表式推导 scores = [s["score"] for s in student_with_grade] # 计算平均分 average_score = sum(scores) / len(scores) # 最高分 max_score = max(scores) # 最低分 min_score = min(scores) # 统计每个等级的人数 grade_counts = {} for student in student_with_grade: grade = student["grade"] grade_counts[grade] = grade_counts.get(grade, 0) + 1 # 输出结果 result = "成绩报告\n" # 分割线 result += "=" * 42 + "\n" # 添加表头 result += f"{'学生姓名':<10}{'分数':<8}{'等级':<4}\n" result += "=" * 42 + "\n" # 格式化输出每个学生的成绩 for student in student_with_grade: result += ( f"{student['name']:<10}{student['score']:<8.2f}{student['grade']:<4}\n" ) # 分割线 result += "=" * 42 + "\n" # 平均分 result += f"平均分:{average_score}\n" # 最高分 result += f"最高分{max_score}\n" # 最低分 result += f"最低分{min_score}\n" # 等级分布 grade_dist = ",".join( [f"{grade}:{count}人" for grade, count in grade_counts.items()] ) result += f"等级分布{grade_dist}\n" return result def analyze_student_performance(students, filters=None): """ 分析学生表现数据 参数: students: 学生信息列表 filters: 筛选条件字典,可选参数 格式: {"min_score": 80, "max_score": 95, "grade": "A"} 返回: 分析结果字典,包含: { "total_count": 总人数, "filtered_count": 筛选后人数, "average_score": 平均分, "grade_distribution": 等级分布, "top_performers": 前3名学生, "pass_rate": 及格率 } 要求: - 支持按分数范围筛选 - 支持按等级筛选 - 计算及格率(>=60分) - 找出前3名高分学生 - 处理边界情况(空数据、无效筛选条件等) """ # 如果没有筛选数据,返回默认值 if not filters: return { "total_count": 0, "filtered_count": 0, "average_score": 0.0, "grade_distribution": {}, "top_performers": [], "pass_rate": 0.0, } # 学生总人数 total_count = len(students) # 拷贝一份数据 filter_students = students.copy() # 获取当前学生等级 def get_grade(score): if score >= 90: return "A" elif score >= 80: return "B" elif score >= 70: return "C" elif score >= 60: return "D" else: return "F" # 过滤大于最小分数的学生的学生数据 if "min_score" in filters: filter_students = [ s for s in filter_students if s["score"] >= filters["min_score"] ] # 过滤小于最大分数分的学生数据 if "max_score" in filters: filter_students = [ s for s in filter_students if s["score"] <= filters["max_score"] ] # 等级筛选 if "grade" in filters: filter_grade = filters["grade"] filter_students = [ s for s in filter_students if get_grade(s["score"]) == filter_grade ] # 筛选后的学生数量 filter_count = len(filter_students) # 计算平均分 if filter_students: average_score = sum(s["score"] for s in filter_students) / filter_count else: average_score = 0.0 # 统计筛选后的各个等级的人数 grade_distribution = {} for student in filter_students: grade = get_grade(student["score"]) grade_distribution[grade] = grade_distribution.get(grade, 0) + 1 # 针对学生的分数进行排序 sorted_students = sorted(filter_students, key=lambda x: x["score"], reverse=True) # 取前三名 top_performers = sorted_students[:3] # 筛选出及格人数 pass_count = sum(1 for s in filter_students if s["score"] >= 60) # 计算出及格率 pass_rate = pass_count / len(filter_students) * 100 if pass_count > 0 else 0.0 return { "total_count": total_count, "filter_count": filter_count, "average_score": average_score, "grade_distribution": grade_distribution, "top_performers": top_performers, "pass_rate": pass_rate, } # 测试数据 test_students = [ {"name": " 张三 ", "age": "20", "score": "85.5", "is_passed": "true"}, {"name": "李四", "age": "19", "score": "92.0", "is_passed": "true"}, {"name": "王五", "age": "21", "score": "78.3", "is_passed": "false"}, {"name": "赵六", "age": "22", "score": "65.7", "is_passed": "true"}, {"name": "钱七", "age": "20", "score": "45.2", "is_passed": "false"}, ] # 筛选条件测试 test_filters = [{"min_score": 80, "max_score": 95}, {"grade": "A"}, {"min_score": 60}] # 格式化学生数据 process_students = [] for i, student in enumerate(test_students): processed = process_student_data(student) if processed: process_students.append(processed) print(f"学生{i}:{processed}") else: print(f"第{i+1}个学生数据无效") # 计算学生成绩与格式化 if process_students: grade_report = calculate_and_format_grades(process_students) print(grade_report) # 测试数据筛选和统计分析 print("3. 数据筛选与统计:") # 准备三组不同的筛选条件 test_filters = [{"min_score": 80}, {"grade": "A"}, {"min_score": 60, "max_score": 90}] # 遍历筛选条件,输出分析结果 for i, filter_condition in enumerate(test_filters, 1): print(f"筛选条件{i}:{filter_condition}") result = analyze_student_performance(process_students, filter_condition) print(f"总人数{result['total_count']},筛选后的人数{result['filter_count']}") print(f"平均分{result['average_score']:.2f},及格率:{result['pass_rate']}") print(f"等级分布{result['grade_distribution']}") print(f"前三名{[s['name'] for s in result['top_performers']]}")