292 lines
9.0 KiB
Python
292 lines
9.0 KiB
Python
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']]}")
|