8/9 get_class_average([alice]) resulted in an error: string indices must be integers, not str


#1
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)
    total=total/len(numbers)
    return total

def get_average(student):
    homework=average(student["homework"])
    quizzes=average(student["quizzes"])
    tests=average(student["tests"])
    total=homework*0.1+quizzes*0.3+tests*0.6
    return total 

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"
    else:
        return"F"
print get_letter_grade(get_average(lloyd))

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

Thank you in advance!

#2

Hi @magikarpediem ,

Because the code that you posted is not formatted, it is difficult for other users to read and debug it. After code has been pasted into the editing window for posting, you can format it by selecting it, and then by clicking the </> button above the editing area. This will enable us to see important details, such as the indentation and underscores.

Your get_class_average function is as follows, assuming that the indentation is correct ...

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

In the above, the function parameter is given as student, but the loop header is ...

for student in students :

The function parameter should be named students, so that it is assigned a list via an argument during the function call, and then serves as the source of items that are assigned to student during execution of the for loop. To make this happen, change the function header to the following, so that it matches the name of the list given in the for loop header ...

def get_class_average(students):

Check all of your indentation to make sure that it is correct.


#3

Sorry but it returns this instead "Oops, try again. get_class_average([alice, lloyd]) returned 91.15 instead of 85.85 as expected." I've updated my code. Thank you


#4

I had the same problem @magikarpediem. Make sure your return line is on the same indentation as your for line.