【问题标题】:How to create function using list *args to a dictionary?如何使用 list *args 创建函数到字典?
【发布时间】:2021-07-14 05:06:20
【问题描述】:

您好,我正在尝试编写一个函数,该函数采用可变数量的列表,这些列表可以包含任意数量的单词。我希望返回的是一个字典,其中单词是键,值是所有列表中每个单词的总数。

我的代码适用于单个列表:

wl1 = ['double', 'triple', 'int', 'quadruple']
new_dict = {}
for i in range(len(wl1)):
    new_dict[wl1[i]] = wl1.count(wl1[i])

并返回:

{'double': 1, 'triple': 1, 'int': 1, 'quadruple': 1}

但它不适用于多个列表并显示不可散列的列表类型:

def varlist(*items):
    newdict = {}
    for i in range(len(items)):
        newdict[items[i]] = items.count(items[i])
    return (newdict)

我应该改用 **kwargs 将其编入字典吗?如果是这样,我会使用它们的频率计数将变量列表项更改为字典吗?任何提示都会非常有帮助。

【问题讨论】:

    标签: python dictionary mapping args keyword-argument


    【解决方案1】:

    根据您的代码,问题出在这一行:

                 newdict[items[i]] = items.count(items[I])
    

    我测试了函数并传递了几个列表(['foo', 'bar'], ['foo','bad']),问题是 items 变量现在包含一个 list列表

    [['foo', 'bar'], ['foo','bad']]

    所以,当您创建第一个 for 并尝试放入 newdict 时,您正在执行以下操作:

    newdict[['foo','bar']] = ....

    由于您不能将列表用作字典的键,因此您得到了“不可散列的列表类型”

    您可以做的是将所有列表合并到一个主列表中:

    master_list = [word for sublist in items for word in sublist]

    这是修改后的版本:

    def varlist(*items):
        newdict = {}
        master_list = [word for sublist in items for word in sublist]
        for i in range(len(master_list)):
            newdict[master_list[i]] = master_list.count(master_list[i])
        return newdict
    

    【讨论】:

      【解决方案2】:

      您可以将可变数量的列表变成一个列表:

      def varlist(*items):
          items = itertools.chain(*items)
          return dict(Counter(items))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-28
        • 1970-01-01
        • 2018-06-21
        • 1970-01-01
        • 1970-01-01
        • 2015-12-07
        相关资源
        最近更新 更多