Part of the whole


#1



https://www.codecademy.com/courses/python-beginner-en-qzsCL/1/4?curriculum_id=4f89dab3d788890003000096


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

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


#2

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


#3

I would expect this portion of code:

results.append(get_average(students))

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?


#4

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?


#5

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.


#6

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.


#7

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