Игнорирование определенной буквенной оценки при расчете средней оценки учащихся

#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:
введите описание изображения здесь

Ответ №1:

Конечно, есть несколько способов. Самый простой подход, вероятно, состоит в том, чтобы просто проверить строку » 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 and логической операцией, чтобы также убедиться, что Course_Grade не является «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']) amp; (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
 

Ответ №2:

  if course in row[0]:
     if row[3]!='W':
          get_grade = findnumericgrade(row[3])
          total  = float(get_grade)
          count  = 1
      avg = total / count