8. Part of the Whole Error


#1



Hi there,

Below is my code which is receiving this error, 'Oops, try again. get_class_average([alice]) resulted in an error: list indices must be integers, not str' and I cant seem to figure it out at all! I have looked at all the other posts but none seem to be resolving this error, this is my code;

Please help???


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],
}

students = [lloyd, alice, tyler]

# Add your function below!
def average(numbers):
    total = float(sum(numbers)) / len(numbers)
    return total

def get_average(students):
    homework = average(student["homework"]) 
    quizzes = average(student["quizzes"]) 
    tests = average(student["tests"])
    weighting = (homework*.1)+(quizzes*.3 )+(tests*.6)
    return weighting
    
def get_class_average(students):
    results =[]
    for students in students:
        results.append(get_average(students))
    return average(results)

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"


#2

this line:

results.append(get_average(students))

you have get_average(students), students is a list, but get_average is designed to calculate the average grade for a single student, how could you do this?


#3

In the get_class_average function, you have this ...

results.append(get_average(students))

You should be passing an individual student to the get_average function.


#4

Should I first of all get the average for each student, then store the sum of these averages in a variable. Then get the average of that sum and then append it to results?


#5

you loop over students (your function parameter), so then the iterator (student) contains each student in your students list. Now you can append the average grade of each student to results


#6

Ahh, so because the get_average function iterates over students already, I don't need to include it in the results.append line;

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

This is what the function is now but I get this error instead;

Oops, try again. get_class_average([alice]) resulted in an error: unsupported operand type(s) for +: 'int' and 'function'

Could this be an error with the get_average function?


#7

I missed the fact that your loop is faulty. General syntax for your loop:

for iterator in list:

its really uncommon to have the same name for the iterator and the list.

the idea is to loop over you list, this will give you each individual student, for which you can then calculate the average of this student, and append this to results


#9

Thank you all for your help, I have realised that the names that were being used in the for loop were not the names defined in the rest of the program. I was also missing a print statement at the end of the code. Very silly error reflecting back on it but an easy mistake to make, here is the code;

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],
}

students = [lloyd, alice, tyler]

# Add your function below!
def average(numbers):
    total = float(sum(numbers)) / len(numbers)
    return total

def get_average(student):
    homework = average(student["homework"]) 
    quizzes = average(student["quizzes"]) 
    tests = average(student["tests"])
    weighting = (homework*0.1)+(quizzes*0.3 )+(tests*0.6)
    return weighting
    
def get_class_average(students):
    results =[]
    for student in students:
        results.append(get_average(student))
    return average(results)

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)))

#10