首页 > 解决方案 > 如何使用 list *args 创建函数到字典?

问题描述

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

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

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 来将其编入字典吗?如果是这样,我会使用它们的频率计数将变量列表项更改为字典吗?任何提示都会非常有帮助。

标签: pythondictionarymappingargskeyword-argument

解决方案


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

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

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

[['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

推荐阅读