You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:01:21