如何使用 list *args 到字典创建函数?

How to create function using list *args to a dictionary?

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

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

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

和return是这样的:

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

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

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

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

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

您可以将可变数量的列表合并为一个列表:

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