Попытка вычислить высшие оценки с именем в Python

grade=[]
names=[]
highest=0



cases=int(input('Enter number of cases: '))
for case in range(1,cases+1):
    print('case',case)

    number=int(input('Enter number of students: '))
    for numbers in range (1,number+1):

        name=str(input('Enter name of student: '))
        names.append(name)
        mark=float(input('Enter mark of student:'))
        grade.append(mark)


    print('Case',case,'result') 
    print('name',list[list.index(max(grade))])
    average=(sum(grade)/number)
    print('average',average)
    print('highest',max(grade))
    print('name',names[grade.index(max(grade))])

Я хочу напечатать имя студента с самой высокой оценкой. Я не узнал ничего, кроме списка, пока и для. НЕТ словарь.. ничего. Мне было интересно, как я могу это сделать? ТАКЖЕ я получаю эту ошибку!!! builtins.AttributeError: объект 'str' не имеет атрибута 'append'. ПОМОГИТЕ. благодарю вас!:D

2 ответа

  1. for number in range (1,number+1):
    

    Не используйте имена переменных для разных вещей, вызовите одно из них numbers и другие number:

    numbers=int(input('Enter number of students: '))
    for number in range (1,numbers+1):
    
  2. Ты сделал name список в начале:

    name=[]
    

    но здесь вы назначаете один вход:

    name=str(input('Enter name of student: '))
    

    Вы добавляете новое имя к себе:

    name.append(name)
    

    что невозможно, потому что name после ввода больше не список, а строка. Снова использование разных имен переменных для разных вещей поможет. Вызвать массив names и единственный вход name:

    names = []
    #...
    name=str(input('Enter name of student: '))
    names.append(name)
    
  3. И здесь:

     print('name',list[list.index(max(grade))])
    

    list это встроенный тип, а не одна из ваших переменных, поэтому вы пытаетесь индексировать тип, а не конкретный список. Если вы хотите позвонить index в конкретном списке вы делаете это, используя имя переменной этого списка. grade.index(...) найдет конкретную позицию, соответствующую пройденному баллу в grade и затем вы можете использовать эту позицию, чтобы получить соответствующее имя, потому что вы знаете, что имя находится в той же позиции в names:

    print('name',names[grade.index(max(grade))])
    

Вот несколько более сложная версия; проработав его, вы лучше почувствуете язык.

from collections import namedtuple
import sys

# Python 2/3 compatibility shim
if sys.hexversion < 0x3000000:
    inp, rng = raw_input, xrange    # Python 2.x
else:
    inp, rng = input, range         # Python 3.x

def type_getter(type):
    """
    Build a function to prompt for input of required type
    """
    def fn(prompt):
        while True:
            try:
                return type(inp(prompt))
            except ValueError:
                pass        # couldn't parse as the desired type - try again
    fn.__doc__ = "\n    Prompt for input and return as {}.\n".format(type.__name__)
    return fn
get_int   = type_getter(int)
get_float = type_getter(float)

# Student record datatype
Student = namedtuple('Student', ['name', 'mark'])

def get_students():
    """
    Prompt for student names and marks;
      return as list of Student
    """
    students = []
    while True:
        name = inp("Enter name (or nothing to quit): ").strip()
        if name:
            mark = get_float("Enter {}'s mark: ".format(name))
            students.append(Student(name, mark))
        else:
            return students

def main():
    cases = get_int("How many cases are there? ")
    for case in rng(1, cases+1):
        print("\nCase {}:".format(case))
        # get student data
        students = get_students()
        # perform calculations
        avg = sum((student.mark for student in students), 0.) / len(students)
        best_student = max(students, key=lambda x: x.mark)
        # report the results
        print(
            "\nCase {} average was {:0.1f}%"
            "\nBest student was {} with {:0.1f}%"
            .format(case, avg, best_student.name, best_student.mark)
        )

if __name__=="__main__":
    main()

который работает как:

How many cases are there? 1

Case 1:
Enter name (or nothing to quit): A
Enter A's mark: 10.
Enter name (or nothing to quit): B
Enter B's mark: 20.
Enter name (or nothing to quit): 

Case 1 average was 15.0%
Best student was B with 20.0%
Другие вопросы по тегам