Как получить средний семестр - PullRequest
1 голос
/ 21 февраля 2020

У меня есть код, который примет легенду об оценках и количество оценок, а затем вернет значения для него. У меня все в порядке, кроме среднего семестра. Вот формула для нахождения среднего за семестр:

homework average * 0.2 + quiz average * 0.2 + project average * 0.6.

Мой код хорошо работает со средними домашними заданиями, средними по тестам и средними по проектам, но не со средними по семестрам. Вот что я написал:

def get_header():  
    gb_data = open('gb_data.txt','r')
    header = gb_data.readline()
    return header.strip()

def get_content():  
    gb_data = open('gb_data.txt','r')
    content = gb_data.readlines()
    del content[0]
    return content

hw_pos = []
project_pos = []
quiz_pos =  []

header_list = get_header()
header_list = header_list.split(", ")
header_list_index = enumerate(header_list)
for index, target in header_list_index:
    if target == "hw":
        hw_pos.append(index)
    elif target == "quiz":
        quiz_pos.append(index)
    elif target == "project":
        project_pos.append(index)

content_list = get_content()

avg_dict = {}

for element in content_list:
    element = element.strip().split(", ")

    name = element[0] + ', ' + element[1]
    hw_avg = sum([int(element[i]) for i in hw_pos]) / len(hw_pos)
    quiz_avg = sum([int(element[i]) for i in quiz_pos]) / len(quiz_pos)
    project_avg = sum([int(element[i]) for i in project_pos]) / len(project_pos)
    sem_avg = hw_avg * 0.2 + quiz_avg * 0.2 + project_avg * 0.6
    avg_dict.update({name:(hw_avg, quiz_avg, project_avg, sem_avg)})


f = open('avg.txt', 'w')
for name, avg in avg_dict.items():
  dataline = name + ": hw avg = " + str(round(avg[0], 2)) + ", quiz avg = " + str(round(avg[2], 2)) + ", proj avg = " + str(round(avg[1], 2)) + ", sem avg = " + str(round(avg[2], 2)) + "\n"
  f.write(dataline)

f.close()

Вот пример ввода, который я вставил:

last, first, hw, hw, project, quiz, hw, hw, hw, quiz, hw, hw, project
Cat, Figaro, 57, 58, 71, 93, 56, 86, 90, 99, 55, 99, 88

Верхняя строка - легенда, так что игнорируйте, мой код обрабатывает вот что должно быть возвращено:

Cat, Figaro: hw avg = 71.57, quiz avg = 96.0, proj avg = 79.5, sem avg = 81.21

Вот что я на самом деле получаю:

Cat, Figaro: hw avg = 71.57, quiz avg = 96.0, proj avg = 79.5, sem avg = 96.0

Я хочу, чтобы они соответствовали ТОЧНО, вплоть до каждого символа. Мне просто нужно знать, как правильно его округлить. Это НЕ домашнее задание, а просто проект для лучшего понимания файлов, я очень близок !! Меня зовут Скарлетт, пожалуйста, помогите !!!

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

У вас есть опечатка этой строки:

dataline = name + ": hw avg =" + str (round (avg [ 0 ], 2)) + " , викторина avg = "+ str (раунд (avg [ 2 ], 2)) +", proj avg = "+ str (раунд (avg [ 1 ], 2)) + ", sem avg =" + str (round (avg [ 2 ], 2)) + "\ n"

Должно быть

dataline = name + ": hw avg =" + str (round (avg [ 0 ], 2)) + ", викторина avg =" + str (round (avg [ 1 *) 1021 *], 2)) + ", proj avg =" + str (round (avg [ 2 ], 2)) + ", sem avg =" + str (round (avg [) 3 ], 2)) + "\ n"

вместо. С расчетом все в порядке, только результат был испорчен (Вы печатали 0, 2, 1, 2 вместо 0, 1, 2, 3). Чтобы предотвратить подобные ошибки в будущем, возможно, посмотрите на Pandas с именами столбцов? Pandas в данном случае, вероятно, является излишним, но очень мощным инструментом для табличных вычислений.

0 голосов
/ 21 февраля 2020

Это должно работать:

from statistics import mean

legend = ['last', 'first', 'hw', 'hw', 'project', 'quiz', 'hw', 'hw', 'hw', 'quiz', 'hw', 'hw', 'project']
grades = ['Cat', 'Figaro', 57, 58, 71, 93, 56, 86, 90, 99, 55, 99, 88]

hw_avg = mean([g for l, g in zip(legend, grades) if l == 'hw'])
quiz_avg = mean([g for l, g in zip(legend, grades) if l == 'quiz'])
project_avg = mean([g for l, g in zip(legend, grades) if l == 'project'])
sem_avg = hw_avg * 0.2 + quiz_avg * 0.2 + project_avg * 0.6

print(f'{grades[0]}, {grades[1]}: hw avg = {hw_avg:.2f}, quiz avg = {quiz_avg:.2f}, project avg = {project_avg:.2f}, sem avg = {sem_avg:.2f}')

Это дает мне следующее:

Cat, Figaro: hw avg = 71.57, quiz avg = 96.00, project avg = 79.50, sem avg = 81.21

Обратите внимание, что я просто использую statistics.mean, поскольку он делает код чище. Но вы можете сделать то же самое с методом, подобным вашему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...