从班级成绩单到数据分析用Python轻松复刻ZZULIOJ 1128题并拓展更多实用功能当班主任把一叠成绩单交到你手上时那些密密麻麻的数字是否让你感到无从下手作为班干部或助教我们常常需要从原始成绩数据中提取有价值的信息。本文将带你用Python这把瑞士军刀从解决ZZULIOJ 1128题的基础需求出发逐步构建一个完整的成绩分析工具。1. 基础实现计算课程平均分我们先从题目要求的最基本功能开始——计算每门课程的平均分。Python的NumPy库为此类数值计算提供了极大便利。import numpy as np # 读取输入数据 m, n map(int, input().split()) scores np.array([list(map(float, input().split())) for _ in range(m)]) # 计算每列平均值并格式化输出 averages np.mean(scores, axis0) print( .join(f{x:.2f} for x in averages))这段代码简洁地完成了题目要求使用列表推导式读取输入数据将数据转换为NumPy数组利用np.mean计算列平均值格式化输出结果提示如果没有NumPy也可以用纯Python实现但代码会稍显冗长。NumPy的优势在大数据集时更为明显。2. 从文件读取数据更真实的场景实际工作中成绩数据通常存储在文件中。让我们改进程序使其能从CSV或文本文件读取数据。def read_scores_from_file(filename): with open(filename) as f: m, n map(int, f.readline().split()) scores [] for _ in range(m): scores.append(list(map(float, f.readline().split()))) return np.array(scores) # 使用示例 scores read_scores_from_file(scores.txt) averages np.mean(scores, axis0)文件格式示例scores.txt5 4 80 65 70 95 99 38 59 90 30 78 81 85 90 43 13 80 65 87 79 803. 功能扩展全面成绩分析基础平均分只是开始让我们为这个成绩分析工具添加更多实用功能。3.1 学生个人成绩分析def analyze_student_performance(scores): # 计算每个学生的平均分 student_avg np.mean(scores, axis1) # 找出表现最好和最差的学生 best_student np.argmax(student_avg) worst_student np.argmin(student_avg) return { student_averages: student_avg, best_student: best_student, worst_student: worst_student }3.2 课程难度评估def analyze_course_difficulty(scores): course_avg np.mean(scores, axis0) course_std np.std(scores, axis0) # 难度系数平均分越低标准差越大课程越难 difficulty (100 - course_avg) * course_std return { average_scores: course_avg, standard_deviations: course_std, difficulty_index: difficulty }3.3 成绩分布统计def score_distribution(scores, bins[0, 60, 70, 80, 90, 100]): distributions [] for i in range(scores.shape[1]): hist, _ np.histogram(scores[:, i], binsbins) distributions.append(hist) return distributions4. 数据可视化让数据说话数字可能不够直观让我们用matplotlib创建可视化图表。import matplotlib.pyplot as plt def plot_course_averages(averages, course_namesNone): if course_names is None: course_names [f课程{i1} for i in range(len(averages))] plt.figure(figsize(10, 6)) plt.bar(course_names, averages) plt.title(各课程平均分对比) plt.xlabel(课程名称) plt.ylabel(平均分) plt.ylim(0, 100) for i, v in enumerate(averages): plt.text(i, v 1, f{v:.1f}, hacenter) plt.show()更复杂的可视化可以展示成绩分布def plot_score_distribution(scores, course_idx0): plt.figure(figsize(10, 6)) plt.hist(scores[:, course_idx], bins[0, 60, 70, 80, 90, 100], edgecolorblack) plt.title(f课程{course_idx1}成绩分布) plt.xlabel(分数段) plt.ylabel(学生人数) plt.show()5. 结果输出与报告生成分析完成后我们需要将结果保存下来。以下是生成HTML报告的示例def generate_html_report(scores, filenamereport.html): analysis analyze_course_difficulty(scores) student_analysis analyze_student_performance(scores) html f html headtitle班级成绩分析报告/title/head body h1班级成绩分析报告/h1 p共 {scores.shape[0]} 名学生{scores.shape[1]} 门课程/p h2课程分析/h2 table border1 tr th课程/th th平均分/th th标准差/th th难度系数/th /tr for i, (avg, std, diff) in enumerate(zip( analysis[average_scores], analysis[standard_deviations], analysis[difficulty_index] )): html f tr td课程{i1}/td td{avg:.2f}/td td{std:.2f}/td td{diff:.2f}/td /tr html /table h2学生表现/h2 p班级平均分: {:.2f}/p p最高分学生: 第{}名 (平均分: {:.2f})/p p最低分学生: 第{}名 (平均分: {:.2f})/p /body /html .format( np.mean(student_analysis[student_averages]), student_analysis[best_student] 1, student_analysis[student_averages][student_analysis[best_student]], student_analysis[worst_student] 1, student_analysis[student_averages][student_analysis[worst_student]] ) with open(filename, w) as f: f.write(html)6. 进阶功能异常检测与成绩预测对于更深入的分析我们可以添加一些机器学习功能。from sklearn.ensemble import IsolationForest def detect_anomalies(scores): # 使用孤立森林检测异常分数 clf IsolationForest(contamination0.05) preds clf.fit_predict(scores) anomalies np.where(preds -1)[0] return anomalies成绩预测模型简单线性回归示例from sklearn.linear_model import LinearRegression def predict_final_score(midterm_scores, final_scores): # 用期中成绩预测期末成绩 model LinearRegression() model.fit(midterm_scores.reshape(-1, 1), final_scores) return model7. 完整应用示例将以上功能整合成一个完整的成绩分析工具class GradeAnalyzer: def __init__(self, filename): self.scores read_scores_from_file(filename) self.course_analysis analyze_course_difficulty(self.scores) self.student_analysis analyze_student_performance(self.scores) def generate_report(self, report_typeconsole): if report_type console: self._print_console_report() elif report_type html: generate_html_report(self.scores) elif report_type visual: plot_course_averages(self.course_analysis[average_scores]) def _print_console_report(self): print(\n 课程分析 ) for i, (avg, std, diff) in enumerate(zip( self.course_analysis[average_scores], self.course_analysis[standard_deviations], self.course_analysis[difficulty_index] )): print(f课程{i1}: 平均分{avg:.2f}, 标准差{std:.2f}, 难度系数{diff:.2f}) print(\n 学生表现 ) print(f班级平均分: {np.mean(self.student_analysis[student_averages]):.2f}) print(f最高分学生: 第{self.student_analysis[best_student]1}名) print(f最低分学生: 第{self.student_analysis[worst_student]1}名) # 使用示例 analyzer GradeAnalyzer(scores.txt) analyzer.generate_report(console) analyzer.generate_report(visual)这个工具现在可以从文件读取成绩数据进行全面的课程和学生分析生成控制台报告或可视化图表输出HTML格式的分析报告在实际使用中我发现将分析结果可视化后能更直观地向老师和同学们展示班级整体表现。特别是当需要向不熟悉数据的对象解释分析结果时图表往往比数字表格更有说服力。