Welcome to the Treehouse Community
Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.
Looking to learn something new?
Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.
Start your free trialeestsaid
1,311 Pointscode challenge sets.py task 1
I don't understand what the question is asking to kick this one off. The part of the question that doesn't make sense reads:
So, first, write a function named covers that accepts a single parameter, a set of topics. Have the function return a list of courses from COURSES where the supplied set and the course's value (also a set) overlap.
For example, covers({"Python"}) would return ["Python Basics"].
Is the example suggesting that a random set is provided (here, covers({"Python"})) and out of the dict keys the only one that it overlaps with is ["Python Basics"]??? So if the random set that was provided was covers({"Python"}, {"Ruby"}, {"Monkeys"}) the list retrurned would be ["Python Basics", "Ruby Basics"]?
3 Answers
<noob />
17,062 PointsThe goal here is to give a set as an argument which contains elements in the the other sets to see if they common elements. You didnt understand the question correctly, you are trying to use intersection() between the keys of the topics set to the keys of the COURSES set which is wrong because u need to do the intersection() with the values of the COURSES set(which is a set) to the topics set, in order to append the keys of the COURSES set accrording to the question.
take a look at this code:
def covers(topics):
#i create an empty list
set_keys = []
#i loop through the key,value pairs of each dict in the COURSES set in order to get access to the key and the value of each dict.
for key,value in COURSES.items()
#then i check if topics set and value of each key(each value of each key is a set) have common elements.
if topics.intersection(value):
#if they have common elements then i append the key of each key,value pair that we iterated on and found that they something in common
set_keys.append(key)
#then i return the list
return set_keys
if u try to run the program by calling the function:
print(covers({"Python"}))
print(covers({"variables"}))
u get the keys of key,value pairs that has common elements
treehouse:~/workspace$ python try.py
['Python Basics']
['Python Basics', 'Java Basics', 'PHP Basics']
treehouse:~/workspace$
I hope u understand this, i tried to explain it as good as i could
eestsaid
1,311 PointsThanks bot.net. Ive been away and will have a look at this again now. Will let you know how I go. I appreciate your responses.
eestsaid
1,311 PointsYep - I was not undesrtanding the question correctly at all and it is clear now what the question was asking. I also appreciate the elegant solution. So thank you.
I have a couple of follow up questions.
To clarify - covers({"Python", "Java", "integers"}) passes in a set which then is compared to values which through the .items() method is a series of individual sets. Is that correct?
I guess I'm not sure how the .items() method is working in this instance. So my next question, when you run
for key,value in COURSES.items()
does the .items() method give back a tuple of the dict keys and a tuple of the dict values as a tuple of sets? For eample if I test the following function
def covers(topics):
for key, value in COURSES.items():
print(key)
print(value)
covers({"Python"})
the output I get is
Python Basics
{'exceptions', 'arrays', 'Python', 'input', 'loops', 'conditions', 'variables', 'booleans', 'strings', 'integers', 'functions', 'floats'}
Java Basics
{'exceptions', 'input', 'loops', 'variables', 'strings', 'booleans', 'integers', 'Java'}
PHP Basics
{'PHP', 'conditions', 'HTML', 'variables', 'strings', 'booleans', 'integers', 'floats'}
Ruby Basics
{'input', 'conditions', 'strings', 'Ruby', 'integers', 'functions', 'floats'}
Im not sure how to interpret the output. I hope this make sense. Pleae feel free to ask me to clarify.
<noob />
17,062 PointsHi. here are the steps u need to do: 1.create an empty list since u want to return a list. loop through the key value pairs of the dict with the items() function. check if the passed in set have common element with the value of each key value pair, u do it with the intersection command, if the sets does have common elements u append the key of the iterated key value pair to the empty list. Lastly u need to return the list. gl!
eestsaid
1,311 PointsThanks bot.net and Robin
Given my intuition for the question above I tried just making a list of the key values only (seemed tidier), changed that list to a set and then perform the intersection.
Unfortunately the result I get is a empty list []. Any thoughts on this approach and hints as to where it might failing?
def covers(topics):
set_keys = []
for key in COURSES.keys():
set_keys.append(key)
set_keys = set(set_keys)
set_keys = set_keys.intersection(topics)
print(list(set_keys))
covers({"Python", "Java"})
<noob />
17,062 Pointswhen u use items() u loop through each of the key value pairs. u have 4 keys and a 4 values which contain a set. that is why when u print key and value u get back the first key which is python basics and the value of that key which is his set.
eestsaid
1,311 PointsThanks bot.net
Robin Goyal
4,582 PointsRobin Goyal
4,582 PointsYes, your intuition is correct here!