Files
python/13-17/lianxi-02student.py
2026-05-06 11:21:42 +08:00

292 lines
9.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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']]}")