Part of the whole


I am recieving the error message "
Oops, try again. get_class_average([alice]) resulted in an error: list indices must be integers, not str"

I expected to get the average weighted average of the class returned. I can't tell if I am trying to be too clever or just way off the mark. anyway my head is sore from thinking about it so I call for aid!

lloyd = {
    "name": "Lloyd",
    "homework": [90.0, 97.0, 75.0, 92.0],
    "quizzes": [88.0, 40.0, 94.0],
    "tests": [75.0, 90.0]
alice = {
    "name": "Alice",
    "homework": [100.0, 92.0, 98.0, 100.0],
    "quizzes": [82.0, 83.0, 91.0],
    "tests": [89.0, 97.0]
tyler = {
    "name": "Tyler",
    "homework": [0.0, 87.0, 75.0, 22.0],
    "quizzes": [0.0, 75.0, 78.0],
    "tests": [100.0, 100.0]

# Add your function below!
def average(numbers):
    total = sum(numbers)
    total = float(total)
    length = total / len(numbers)
    return length
def get_average(student):
    homework = average(student["homework"])
    quizzes = average(student["quizzes"])
    tests = average(student["tests"])
    grade = 0.1*homework + 0.3*quizzes + 0.6*tests
    return grade
def get_letter_grade(score):
    if score >= 90:
        return "A"
    elif score >= 80:
        return "B"
    elif score >= 70:
        return "C"
    elif score >= 60:
        return "D"
        return "F"
print get_letter_grade(lloyd)

def get_class_average(students):
    results = []
    for student in students:
        students = [lloyd, alice, tyler]
    return results


Why make this inside the function? When the students parameter already handles it.


I would expect this portion of code:


to use my previous function and calculate weighted averages for each of the students in my list "students" and then to stick the results of that into the "results" list. I really can't see why it wouldn't do that. Am I trying to do too much in the line?


to be honest.. because the lesson asked me to do it.. (I think)

but what do you mean by the students parameter already handles it? how does it know that by students I mean those 3 items?


For the get_average(student) function, you want to send a single value rather than a list because the method can only handle a single student. the class_average(students) takes some of the load off by taking in the list and sending each student one by one to get_average(student).

Even though Codecademy doesn't show it (they should). They are testing your code with list that do not appear inside your code. such as get_class_average(alice) Your get_class_average should be dynamic enough to handle these different tests and still provide the right answers.
By overwriting students inside the function, it gets rid of the flexibility of a function.


OK. I think I get what you are saying. i've had a long day and my head is a bit scrambled. i'll give it one last bash otherwise I will come back to it tomorrow. thanks dude.


This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.