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 trial

Python Python Collections (2016, retired 2019) Sets Set Math

I can't seem to get this one right

I can't find the right code for this one.

sets.py
COURSES = {
    "Python Basics": {"Python", "functions", "variables",
                      "booleans", "integers", "floats",
                      "arrays", "strings", "exceptions",
                      "conditions", "input", "loops"},
    "Java Basics": {"Java", "strings", "variables",
                    "input", "exceptions", "integers",
                    "booleans", "loops"},
    "PHP Basics": {"PHP", "variables", "conditions",
                   "integers", "floats", "strings",
                   "booleans", "HTML"},
    "Ruby Basics": {"Ruby", "strings", "floats",
                    "integers", "conditions",
                    "functions", "input"}
}

def covers(arg):
    course = []
    for key, value in COURSES.items():
        if value & arg:
            course.append(key)
    return course

def covers_all(*arg):
    course = []
    for key, value in COURSES.items():
        if value.issuperset(arg):
             course.append(key)
    return course

2 Answers

Pete P
Pete P
7,613 Points

Worked for me after removing the asterisk from *arg.

Hopefully someone can clarify this better, but I believe *arg is used when you are passing an unknown amount of arguments to a function that is prepared to unpack them. Right now whatever set is being passed into your function gets unpacked into a tuple with the set being the only element of that tuple.

Chris Freeman
MOD
Chris Freeman
Treehouse Moderator 68,441 Points

Pete P's answer is close enough to be correct. In short, the parameter and its use as an argument to issubset() need to agree: either both have an asterisk or neither. This way it's either a single variable received and used or a tuple received and unpacked for use.

# without asterisks 
def covers_all(arg):
    course = []
    for key, value in COURSES.items():
        if value.issuperset(arg):
             course.append(key)
    return course

# or with asterisks
def covers_all(*arg):
    course = []
    for key, value in COURSES.items():
        if value.issuperset(*arg):
             course.append(key)
    return course
Pete P
Pete P
7,613 Points

Thanks for clarifying that Chris! As always, much appreciated.