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

解决方法

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

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

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

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

您可以将可变数量的列表转换为一个列表:

var create_payment_json = {
    "intent": "sale","business": "myemail@gmail.com","payer": {
        "payment_method": "paypal"
    },"redirect_urls": {
        "return_url": `return`,"cancel_url": `cancel`
    },"transactions": [{
        "item_list": {
            "items": itemsList
        },"amount": {
            "currency": "USD","total": total.toFixed(2),"details": {
                "subtotal": subPrice.toFixed(2).toString(),"tax": "0.00","shipping": "0.00","discount": sortedDiscount.toFixed(2),}
        },"description": `Store payment.`
    }]
};