2015-03-11 3 views
0

Мне нужно сделать простую программу Python, которая позволяет получить среднее число трех разных студентов и в итоге получить средний класс и распечатать его на экране. Код выглядит следующим образом:Нужна помощь в решении упражнений на Python

john = { 
    "name": "John", 
    "homework": [90.0, 97.0, 75.0, 92.0], 
    "extras": [88.0, 40.0, 94.0], 
    "tests": [75.0, 90.0] 
} 
paul = { 
    "name": "Paul", 
    "homework": [100.0, 92.0, 98.0, 100.0], 
    "extras": [82.0, 83.0, 91.0], 
    "tests": [89.0, 97.0] 
} 
tyler = { 
    "name": "Tyler", 
    "homework": [0.0, 87.0, 75.0, 22.0], 
    "extras": [0.0, 75.0, 78.0], 
    "tests": [100.0, 100.0] 
} 

students = ["john", "paul", "tyler"] 

def average(numbers): 
    total = sum(numbers) 
    total = float(total) 
    return total/len(numbers) 

def get_average(student): 
    homework = average(student["homework"]) 
    extras = average(student["extras"]) 
    tests = average(student["tests"]) 

    return homework*0.1 + extras*0.3 + tests*0.6 

def qualifications_in_letters(result): 
    if result >= 90: 
     return "A" 
    elif 80 <= result < 90: 
     return "B" 
    elif 70 <= result < 80: 
     return "C" 
    elif 60 <= result < 70: 
     return "D" 
    else: 
     return "F" 

def get_class_average(students): 
    marks = [] 
    for student in students: 
     marks.append(get_average(student)) 
    return average(marks) 

print get_class_average(students) 
print qualifications_in_letters(get_class_average(students)) 

Каждый студент имеет словарь с четырьмя ключами и значениями (имя, домашнее задание, статистов и тестов). То, что программа должна делать, - это взять метки учеников, получить их среднее значение, а затем получить средний класс. Домашнее задание составляет 10% от среднего числа учащихся; дополнительные 30% и тесты 60%.

Существует список, в котором имена учащихся являются элементами. Проблема заключается в том, что при запуске кода появляется это сообщение об ошибке:

Traceback (most recent call last): 
    File "<stdin>", line 52, in <module> 
    File "<stdin>", line 49, in get_class_average 
    File "<stdin>", line 28, in get_average 
TypeError: string indices must be integers, not str 

Я не знаю, как это исправить.

Линия 28 является второй в get_average(); строка 49 - внутри петли for, а 52 - это точка, где вызывается get_class_average().

+0

О, стреляйте, я отметил его как неправильный дубликат. Я думал, что вы зацикливаетесь на словаре внизу в 'get_class_average()' –

+0

Не дублируйте, пожалуйста, заново открыть. (Может быть, слишком локализован?) –

+2

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

ответ

3

Ваша проблема эта строка кода:

students = ["john", "paul", "tyler"] 

Вы настраиваете свой список students быть список строк, а не список словарей. Удалите цитаты.

students = [john, paul, tyler] 

Теперь у вас есть список ваших студенческих словарей и программа работает со следующим выходом:

83.8666666667 
B 
0

Вашего students массив представляет собой массив строк (буквальные строки «Джон», «Пол "," tyler ").

Вы должны создать массив, используя имена переменных (без кавычек).

students = [john, paul, tyler] 
Смежные вопросы