lets break it down, first we have a dictionaries. then we create a list called students which contains the students:

`students = [lloyd,alice,tyler]`

which now contain your dictionaries, you can see this:

```
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]
}
print students
```

now back to your get_class_average function:

```
def get_class_average(students):
results = []
for student in students:
print student
get_class_average(students)
```

now we know where students come from, and can see that by looping over the lists, we get access to each individual student.

lets continue:

`results.append(get_average(student))`

we are appending something to `results`

but what exactly? lets look at get_average:

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

so get_average calculated the weighted average grade for each student, we can see this:

```
def get_class_average(students):
results = []
for student in students:
x = get_average(student)
print "the average for", student['name'], "is:", x
```

so then we append this grades to `results`

, so then we have the following list:

`[80.55,91.15,79.9]`

then we simply return the average of this lists (we have a function for this, but the math would be:

`(80.55 + 91.15 + 79.9) / 3`

but our average function calculates this for us, hope this helps