Python CSV成绩统计:已完成平均分计算,求实现剩余4个功能
Python CSV成绩统计任务实现
给定一个Python项目任务,需要读取CSV文件中的人员成绩数据,完成5项统计任务并将结果写入文件,必须保留给定的函数名称,不能修改。目前已经完成第1项任务(按输入文件顺序保存每人姓名及平均分),需要完成剩余4项任务:
- 按平均分升序保存人员姓名及对应的平均分
- 保存平均分排名前三的人员姓名及分数
- 保存平均分最低的三个分数(不含姓名)
- 计算并保存所有成绩的平均分
原始代码框架
import csv # 用于计算平均值 from statistics import mean def calculate_averages(grades, mean): with open("输入CSV文件路径") as infile: reader=csv.reader(infile) with open("输出CSV文件路径" , "w", newline="") as outfile: writer = csv.writer(outfile) for row in reader: name = row[0] grade_mean = (float(grade) for grade in row [1:]) writer.writerow([row[0], mean(grade_mean)]) def calculate_sorted_averages(input_file_name, output_file_name): # 待实现 def calculate_three_best(input_file_name, output_file_name): # 待实现 def calculate_three_worst(input_file_name, output_file_name): # 待实现 def calculate_average_of_averages(input_file_name, output_file_name): # 待实现
注:原
calculate_averages函数的参数定义存在逻辑问题(应接收输入/输出文件名而非grades和mean),若要正常运行,建议修改参数为input_file_name和output_file_name,但按题目要求不得修改函数名称,使用时需自行调整传入参数。
示例CSV数据
mandana,5,7,3,15 hamid,3,9,4,20,9,1,8,16,0,5,2,4,7,2,1 sina,19,10,19,6,8,14,3 sara,0,5,20,14 soheila,13,2,5,1,3,10,12,4,13,17,7,7 ali,1,9 sarvin,0,16,16,13,19,2,17,8
剩余4项任务的实现代码
1. 按平均分升序保存人员姓名及平均分
def calculate_sorted_averages(input_file_name, output_file_name): # 读取所有人员的姓名和平均分 person_avg_list = [] with open(input_file_name, 'r', encoding='utf-8') as infile: reader = csv.reader(infile) for row in reader: name = row[0] # 转换成绩为浮点数并计算平均分 grades = [float(grade) for grade in row[1:]] avg_score = mean(grades) person_avg_list.append((avg_score, name)) # 按平均分升序排序 person_avg_list.sort() # 将结果写入输出文件 with open(output_file_name, 'w', newline='', encoding='utf-8') as outfile: writer = csv.writer(outfile) for avg, name in person_avg_list: writer.writerow([name, avg])
2. 保存平均分排名前三的人员姓名及分数
def calculate_three_best(input_file_name, output_file_name): person_avg_list = [] with open(input_file_name, 'r', encoding='utf-8') as infile: reader = csv.reader(infile) for row in reader: name = row[0] grades = [float(grade) for grade in row[1:]] avg_score = mean(grades) # 用负平均分实现降序排序(避免使用reverse=True) person_avg_list.append((-avg_score, name, avg_score)) # 排序后取前3个最高平均分的人员 person_avg_list.sort() top_three = [(name, avg) for _, name, avg in person_avg_list[:3]] with open(output_file_name, 'w', newline='', encoding='utf-8') as outfile: writer = csv.writer(outfile) writer.writerows(top_three)
3. 保存平均分最低的三个分数(不含姓名)
def calculate_three_worst(input_file_name, output_file_name): avg_scores = [] with open(input_file_name, 'r', encoding='utf-8') as infile: reader = csv.reader(infile) for row in reader: grades = [float(grade) for grade in row[1:]] avg_score = mean(grades) avg_scores.append(avg_score) # 升序排序后取前3个最低分 avg_scores.sort() lowest_three = avg_scores[:3] with open(output_file_name, 'w', newline='', encoding='utf-8') as outfile: writer = csv.writer(outfile) # 每个分数单独占一行,若需同一行输出可改为writer.writerow(lowest_three) for score in lowest_three: writer.writerow([score])
4. 计算并保存所有成绩的平均分
def calculate_average_of_averages(input_file_name, output_file_name): all_grades = [] with open(input_file_name, 'r', encoding='utf-8') as infile: reader = csv.reader(infile) for row in reader: # 收集所有成绩到列表 all_grades.extend([float(grade) for grade in row[1:]]) # 计算所有成绩的总平均分 total_average = mean(all_grades) with open(output_file_name, 'w', newline='', encoding='utf-8') as outfile: writer = csv.writer(outfile) writer.writerow([total_average])
内容的提问来源于stack exchange,提问作者liehos98
相关产品推荐
相关产品推荐

