试着用Python函数中的变量输入参数来解决问题

时间:2018-12-14 07:19:00

标签: python-3.x dictionary set args kwargs

所以首先我要说的是这是我正在处理的代码挑战,其参数如下。

  

因此,首先,编写一个名为Covers的函数,该函数接受单个参数和一组主题。让函数从COURSES返回课程列表,其中提供的设置和课程的值(也是一个设置)重叠。例如,covers({“ Python”})将返回[“ Python Basics”]。

这是我要从包含课程主题的嵌套集的字典中提取信息。

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"}}

现在,搜索dict的集合是for循环的一个非常棘手的问题,但是挑战听起来像是它要我创建一组新的课程名称,其主题与输入的参数匹配,然后输出结果作为列表。

def covers(topics):
    hold_set = set()
    for key in COURSES.keys():
        if topics in COURSES[key]:
            result = key
            hold_set.add(result)
        else:
            continue
    conversion = list(hold_set)
    return conversion

现在我的第一个问题是接受可变数量的参数,我对* args / ** kwargs不太熟悉,因此我在这里使用它们的尝试大多只是导致print函数给了我空列表。另一个正在创建一个额外的不必要集合,以与在字典中搜索子集之后创建的新集合进行比较,这似乎是多余的,因为hold_set已经包含名称并将它们与.intersection()进行比较,然后进行转换将结果放入列表中只会使相同的结果投入更多工作。

但是我离题了,现在我假设这里的主要问题是函数无法接受与主题搜索参数有关的可变数量的参数(因为提交挑战时,它说“没有从中获得正确的输出covers。”),因此,如果有人可以阐明我将如何实现这一目标,那将非常感激,因为几天后我的大脑开始麻木了,我转而去阅读有关计算机其他领域的内容科学解压。

1 个答案:

答案 0 :(得分:0)

如果要使用多个参数,可以尝试以下操作:

def covers(*args):

    mydict = dict()

    for arg in args:
        mylist = list()

        for k, v in COURSES.items():
            if arg in v:
                mylist.append(k)

        mydict[arg] = mylist

    return mydict

使用字典和列表理解,您可以将其简化:

def covers(*args):
    return {arg: [k for k, v in COURSES.items() if arg in v] for arg in args}

这将产生一个字典,其中包含您提供的每个字符串的条目。条目的值是包含所有匹配课程的列表。因此,如果您这样称呼它:

covers('variables', 'Python')

您将收到以下命令:

{'variables': ['PHP Basics', 'Java Basics', 'Python Basics'], 'Python': ['Python Basics']}

关于使用多个参数的问题:* args捕获列表中未在函数定义中明确声明的所有位置参数,而** kwargs类似地捕获dict中的所有关键字参数。因此,通过仅将* args定义为函数参数,该函数调用中的所有参数都将存储为列表,可以照常进行迭代。