Попытка вычислить высшие оценки с именем в 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 ответа
for number in range (1,number+1):
Не используйте имена переменных для разных вещей, вызовите одно из них
numbers
и другиеnumber
:numbers=int(input('Enter number of students: ')) for number in range (1,numbers+1):
Ты сделал
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)
И здесь:
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%