8. Part of the Whole - Number results are incorrect


#1




Oops, try again. get_class_average([alice]) returned 83.8666666667 instead of 91.15 as expected...

Below are the results I get when finding the individual student's average and then returning the class average. I'm not sure where I went wrong with my code.
[80.55]
[80.55, 91.14999999999999]
[80.55, 91.14999999999999, 79.9]
83.8666666667

Any suggestions, hints or clues ?

Thanks peeps!


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 avg(numbers):
    total = float(sum(numbers))
    total = total /len(numbers)
    return total 
 
def get_average(x):
    homework = avg(x["homework"])
    quizzes = avg(x["quizzes"])
    tests = avg(x["tests"])
    return 0.1 * homework + 0.3 * quizzes + 0.6 * tests

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

students = [lloyd, alice, tyler]

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


#2

Hi, @lustwerk ,

In the get_class_average function, from where does the variable, students, originate that you use here? ...

for student in students:

What use do you make of the parameter, x, within that function?


#3

Hello!

I didn't really place much emphasis on the parameter 'x'. I don't think it serves any purpose beyond that the function needed to take at least one parameter ?

the variable, students , was supposed to call to the list of names of the students.

I think I might not be accessing the necessary keys through various parameters?


#4

The purpose of the parameter of the get_class_average function is to enable the caller of the function to pass it a list of student dictionaries as an argument. Therefore, you should utilize the for loop to access that parameter. However, your for loop header ...

for student in students:

... accesses the global students list directly, making it impossible for a user of the function to successfully pass a different list of student dictionaries to it, and have the function process that list.


#5

I see I see!

So I needed to have changed my for loop to access each item within the parameter of the get_class_average function. The function parameter can be anything as long as does NOT refer to the global students list / as long as my for loop also does NOT refer to the global students list.

I changed my code to:
def get_class_average(x):
results = []
for i in x:
results.append((get_average(i)))
print results
return avg(results)
print get_class_average(students)

(disregard spacing due to copy/paste?)

I think I got it appylpye!


#6

You try

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

#8

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