Part of the Whole


#1

Part of whole

I've looked over all thousand times but still can't get it right.
It keeps saying that "Oops, try again. get_class_average([alice]) resulted in an error: list indices must be integers, not str"

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

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

students = [lloyd, alice, tyler]
def get_average(student):
    homework = average(students["homework"])
    quizzes = average(students["quizzes"])
    tests = average(students["tests"])
    for name in student:
        return 0.1*homework + 0.3*quizzes + 0.6*tests

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


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

#2

Hi @joyishere,

The errors are all contained within this function:

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

1.. using students instead of student

Notice that in this exercise, each student has multiple scores for their homework, quizzes and tests. When we are calculating the average score, we are finding the average score of each component for each student, and not the average of all 3 students (i.e. merely each student's average).

So in this case, instead of doing something like:

do for each student instead. Try it for quizzes and tests as well :slight_smile:

2.. prematurely using a for loop

You did this bit:

  for name in student:
            return 0.1*homework + 0.3*quizzes + 0.6*tests

the for bit is unnecessary, because later on you will be doing for each student anyway over here:

Doing it in the previous function will be confusing then...

Hope this helps :slight_smile:


#3

got it! Thanks a lot :grin:


#4

you're welcome :slight_smile:

remember to check the problem as solved!