Как добавить наибольшее значение из текстового файла в список? - PullRequest
0 голосов
/ 02 ноября 2018

У меня проблемы с попыткой выяснить код для программы, которую я пишу. Мне дают файл в формате:

student_firstname
student_lastname
student_number
assignment_mark
midterm_mark
exam_grade
final_mark

Вот образец:

Marilyn
Malone    
136238
88
72
70
Esther
Mulcahy
194563
25
45
91
William
Gray
110031
33
38
62

Я пытаюсь найти способ вернуть самый высокий и самый низкий final_mark от всех студентов. Что я сделал до сих пор:

infile = open(fileName, "r")
myList = []
name = infile.readline().strip()

passingGrades = 0
failingGrades = 0
avGrade = 0    

while name != '':
    highestGrade = [0, 'studentName']
    lowestGrade = [99, 'studentName']
    lastName = infile.readline().strip()
    studentNum = infile.readline().strip()
    assignGrade = infile.readline().strip()
    midGrade = infile.readline().strip()
    examGrade = infile.readline().strip()
    averageGrade = ((int(assignGrade) * 0.25) + (int(midGrade) * 0.25) +
                    (int(examGrade) * 0.50)) 

    def lowGrade(x):
        if x < lowestGrade[0]:
            lowestGrade.pop(0)
            lowestGrade.pop(0)
            lowestGrade.append(x)
            lowestGrade.append(name)
            lowestGrade.append(lastName)
        return lowestGrade   

    if averageGrade >= 50 and int(examGrade) >= 50:
        #print(name)
        passingGrades += 1
        avGrade += averageGrade

        if averageGrade > highestGrade[0]:
            highestGrade.pop(0)
            highestGrade.pop(0)
            highestGrade.append(averageGrade)
            highestGrade.append(name)
            highestGrade.append(lastName)
        else:
            pass

    else:
        failingGrades += 1
        avGrade += averageGrade

    lowGrade(averageGrade)

    name = infile.readline().strip()

finalAverage = avGrade / (passingGrades + failingGrades)

highFinal = ' '.join(str(x) for x in highestGrade)
lowFinal = ' '.join(str(x) for x in lowestGrade)

Когда программа запускается с использованием одного из текстовых файлов, я получаю:

Number of passes: 9
Number of fails: 1
Average final grade: 64.55
The Highest Grade: 79.5 Patty Marshall
The Lowest Grade: 79.5 Patty Marshall

Любая помощь очень ценится!

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Каждый раз, когда вы читаете нового ученика, вы «сбрасываете» highestGrade и lowestGrade до их начальных значений (0 и 99 соответственно).

while name != '':
     # stuff that happens for each 'name'
    highestGrade = [0, 'studentName']
    lowestGrade = [99, 'studentName']

    # ... do stuff ...

    # read new name
    name = infile.readline().strip()

Исправьте это легко, инициализируя эти значения вне вашего цикла.

highestGrade = [0, 'studentName']
lowestGrade = [99, 'studentName']

while name != '':
     # stuff that happens for each 'name'

Кроме того, ваш lowGrade метод является излишне сложным и избыточным. Вместо того, чтобы удалять элементы из списка и затем добавлять новые элементы, просто создайте новый список. И на самом деле tuple будет более подходящим, чем list, хотя оба будут работать.

lowestGrade = (99, 'studentName')

def lowGrade(x):
    if x < lowestGrade[0]:
        lowestGrade = (x, name, lastName)

Вам не нужно возвращать tuple / list из этого метода, поскольку вы вообще не используете возвращаемое значение.

0 голосов
/ 02 ноября 2018

Каждый раз, когда вы находите наименьшую оценку, вы удаляете 2 значения из списка и добавляете 3. Это означает, что первое значение никогда не удаляется. Можете ли вы проверить, работает ли это для вас?

def lowGrade(x):
    if x < lowestGrade[0]:
        lowestGrade.pop(0)
        lowestGrade.pop(0)
        lowestGrade.append(x)
        lowestGrade.append(' '.join(name, lastName))
    return lowestGrade   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...