计算学生平均成绩时忽略特定字母成绩

2024-09-26 22:10:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图计算取[0]=14224的学生的数字分数的平均值。但是我如何告诉我的程序忽略任何带有“W”的分数呢

import sys
import csv


def findnumericgrade(grade):
    if grade == 'A':
        return 4.0
    elif grade == 'B':
        return 3.0
    else:
        return 2.0


def loaddata(filename, course):
    count = 0
    total = 0.0
    with open(filename, 'r') as f:
        lines = csv.reader(f)
        next(lines)
        for row in lines:
            if course in row[0]:
                get_grade = findnumericgrade(row[3])
                total += float(get_grade)
                count += 1
        avg = total / count
    print(f"The {course} average is: {round(avg, 2)}")


loaddata('studentdata.csv', sys.argv[1])

#studentdata.csv示例: enter image description here


Tags: csvimportreturnifdefcountsys分数
2条回答

当然有很多方法。最简单的方法可能只是检查“W”字符串并继续下一行

实现这一点的一种方法是使用continue控件继续循环中的下一个迭代

def loaddata(filename, course):
    count = 0
    total = 0.0
    with open(filename, 'r') as f:
        lines = csv.reader(f)
        next(lines)
        for row in lines:
            if row[3] == 'W':
                continue  # Go to next iteration in loop
            if course in row[0]:
                get_grade = findnumericgrade(row[3])
                total += float(get_grade)
                count += 1
        avg = total / count
    print(f"The {course} average is: {round(avg, 2)}")

您还可以通过将if语句设置为andboolean operation来实现这一点,以确保课程成绩不是“W”

def loaddata(filename, course):
    count = 0
    total = 0.0
    with open(filename, 'r') as f:
        lines = csv.reader(f)
        next(lines)
        for row in lines:
            if course in row[0] and row[3] != 'W':
                get_grade = findnumericgrade(row[3])
                total += float(get_grade)
                count += 1
        avg = total / count
    print(f"The {course} average is: {round(avg, 2)}")

上面的解决方案可能是最实用的,因为这看起来像某种实用程序脚本,但是根据您期望数据集的大小,您可以使用类似pandas的东西。然后您就可以访问它提供的所有数据操作和分析工具

import sys
import pandas as pd


def find_numeric_grade(grade):
    if grade == 'A':
        return 4.0
    elif grade == 'B':
        return 3.0
    else:
        return 2.0


df = pd.read_csv('studentdata.csv')
section_number = int(sys.argv[1])

print(df[(section_number == df['Section_Number']) & (df['Course_Grade'] != 'W')]
      ['Course_Grade'].apply(find_numeric_grade).mean())

*使用studentdata.csv中的以下数据测试解决方案

Section_Number,Prof_ID,Student_ID,Course_Grade,Student_Name,Course_ID
14224,5,109,B,John Smith,IT1130
14224,5,110,B,Jennifer Johnson,IT1130
14224,5,111,W,Kristen Hawkins,IT1130
14224,5,112,A,Tom Brady,IT1130
14224,5,113,C,Cam Newton,IT1130
14224,5,114,C,Tim Tebow,IT1130
14225,5,115,A,Peyton Manning,IT1130
14225,5,116,B,Maria Sharapova,IT1130
14225,5,117,W,Brian McCoy,IT1130
 if course in row[0]:
     if row[3]!='W':
          get_grade = findnumericgrade(row[3])
          total += float(get_grade)
          count += 1
      avg = total / count

相关问题 更多 >

    热门问题