Python Python Collections (2016, retired 2019) Dictionaries Teacher Stats

status 401
status 401
13,814 Points

help in the seocnd stage in this challange

Im struggling to solve this challange: the code:

def num_courses(dict):
    for x in dict.values():
        print(x)
    return len(x)

i tried to see what i get when i run it at workspace: https://gyazo.com/26d460b8724d7d70d1941c91f4b83b1d

I tried evreything i know it, I dont want to get the correct answer just to give me hints where im wrong

Steven Parker

teachers.py
# The dictionary will look something like:
# {'Andrew Chalkley': ['jQuery Basics', 'Node.js Basics'],
#  'Kenneth Love': ['Python Basics', 'Python Collections']}
#
# Each key will be a Teacher and the value will be a list of courses.
#
# Your code goes below here.
#create a function that take a dictionary and return the length of the dict
def num_teachers(dict):
    return len(dict)

def num_courses(dict):
    for x in dict.values():
        print(x)
    return len(x)

5 Answers

Steven Parker
Steven Parker
171,090 Points

You don't need to "print" anything for the challenge, at best it will be ignored but in some challenges it can cause trouble.

But assuming it's just ignored here, your method will loop through the dictionary, and finally return the number of courses associated with the last teacher. But the challenge wants "the total number of courses for all of the teachers". So you'll need to build up a total count to return.

status 401
status 401
13,814 Points

Why it will only return the number of courses only for the last teacher if i loop trough all the values in the dict?

Steven Parker
Steven Parker
171,090 Points

Because nothing is being done with each value of "x" inside the loop (remember "print" doesn't count). So when the loop is over, "x" still contains the last set of values.

status 401
status 401
13,814 Points

Ignore the print i do it to see what im getting from the output. i understand what your saying but i cant think of a way which i can do what u suggested, how i can add a counter to that?

def num_courses(dict):
    total = 0
    for x in dict.values():
        total += 1
    return total

this is what i tried, in each iteration i add 1 to the total, i still get 2 .

Steven Parker
Steven Parker
171,090 Points

Try adding the number of courses ("len(x)") to the total instead of just 1 each time.

status 401
status 401
13,814 Points

ur suggestion is working but i want to understand what happend "under the hood" lets say my dict is :

course_minutes = {"python basics" : 232, "django basics" : 300 "flashbasics" : 189, "javabasics" : 133, 150,160} 

the values im iterating over are : 232, 300,189,133 if i dont do nothing inside the for loop and only return the len of (x) the output will be 3 because the for loop is ended and the last iteration gave me 3 so this is what i get. but if i add the len(x) in evrey iteration then "i do something" in the for loop and because of that i will get each iteration the total count?

Steven Parker
Steven Parker
171,090 Points

This example does not conform to the course conditions. The dictionary this challenge is intended to work with will have a teacher's name for every key, and a list of courses for the associated value. See the sample shown in the comments of the original question code.

status 401
status 401
13,814 Points

I change my question then if i does nothing inside the for loop, only return the len of (x) i will get only the length of the last item that i iterated on ? and if i add the len(x) in evrey iteration to total i will get the total length of each x because now im doing something inside the for loop for evrey iteration?

is it the behavior? BTW, I really appreciate u keep answer my question after i asked alot of them :]

Steven Parker
Steven Parker
171,090 Points

Now, the code is adding to "total" inside the loop. And inside the loop, "len(x)" is the length of each item, not just the last.

It's only the last outside the loop.