#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])
Ответ №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