2016-11-17 7 views
0

Я ищу, чтобы найти среднее значение «всего» для тестовых баллов класса. Я запускаю свою программу, но продолжаю получать «TypeError: неподдерживаемый тип операндов для +: 'int' и 'str'.Как найти среднее значение для многомерного списка?

def newRecord(students,tests): 
    students = int(input('How many students are in your class? ')) 
    tests = int(input('How many tests have you given? ')) 

    record = [] 
    for i in range(students): 
    rec_line = [] 
    for j in range(tests+1): 
    rec_line.append(0) 
    record.append(rec_line) 
    print('record:',record) 
    print('modified record:',record) 

    for A in range (students): 
    record[A][0] = input('Please enter student {} name '.format(A+1)) 
    for B in range (1, tests+1): 
     record[A][B] = input ('Please enter test score {} '.format(B)) 
    print (record) 

    total= float(sum(record))/ len(record) 
    print ('Average is: ',total) 
+2

В настоящее время это выглядит как функция 'newRecord' имеет только две строки, которые я сомневаюсь. Исправьте свой отступ. –

+0

Какая строка дает вам 'TypeError'? – Arman

+1

Вы помещаете имена учащихся в этот список и пытаетесь добавить весь список вверх. Как вы ожидаете, что это сработает? Вы также забываете преобразовать строку оценки в int или float в 'record [A] [B] = input (...)'. –

ответ

0

Каждый результат теста должен быть преобразован в int или float для выполнения математических функций на них. В приведенном выше примере вы также обращаетесь к имени студента, который будет вызывать ошибку при попытке вычисления «среднего».

def newRecord(students,tests): 
    students = int(input('How many students are in your class? ')) 
    tests = int(input('How many tests have you given? ')) 

record = [] 
for i in range(students): 
    rec_line = [] 
    for j in range(tests+1): 
     rec_line.append(0) 
    record.append(rec_line) 
print('record:',record) 
print('modified record:',record) 

for A in range (students): 
    record[A][0] = input('Please enter student {} name '.format(A+1)) 
    for B in range (1, tests+1): 
     record[A][B] = input ('Please enter test score {} '.format(int(B))) 
print(record) 

total= sum([int(score) for score in rec[1:] for rec in record])/len([int(score) for score in rec[1:] for rec in record]) 
print('Average is: ',total) 

Пример использования:

record: [[0, 0, 0], [0, 0, 0]] 
modified record: [[0, 0, 0], [0, 0, 0]] 
Please enter student 1 name Alice 
Please enter test score 1 2 
Please enter test score 2 3 
Please enter student 2 name Bob 
Please enter test score 1 4 
Please enter test score 2 5 
[['Alice', '2', '3'], ['Bob', '4', '5']] 
Average is: 3.5 
+0

Я бы также рекомендовал использовать лучшую структуру данных для оценки, такую ​​как словарь, который позволит вам просмотреть список результатов для данного имени ученика. Так, например, при использовании выше словарь может выглядеть так: 'record = {« Алиса »: [2, 3],« Боб »: [4, 5]}'. Это может быть потенциальным решением того, что @Alex Hall замечает выше. –