与字典中的值交换键的最佳方法是列表中的值?

时间:2019-06-20 21:12:56

标签: python-3.x dictionary

我的字典(cpc_docs)具有类似的结构

{
sym1:[app1, app2, app3],
sym2:[app1, app6, app56, app89],
sym3:[app3, app887]
}

我的字典有15K键,它们是唯一的字符串。每个键的值是应用程序编号的列表,它们可以显示为多个键的值。

我看过这里[Python: Best Way to Exchange Keys with Values in a Dictionary?,但是由于我的值是一个列表,因此出现错误unhashable type: list

我尝试了以下方法:

res = dict((v,k) for k,v in cpc_docs.items())
for x,y in cpc_docs.items():
    res.setdefault(y,[]).append(x)
new_dict = dict (zip(cpc_docs.values(),cpc_docs.keys()))

因为我的值是列表,所以这些工作当然都没有。

我希望值列表中的每个唯一元素及其所有键都作为列表。

类似这样的东西:

{
app1:[sym1, sym2]
app2:[sym1]
app3:[sym1, sym3]
app6:[sym2]
app56:[sym2]
app89:[sym2]
app887:[sym3]
}

一个奖励是根据每个值列表的len来订购新字典。就像这样:

{
app1:[sym1, sym2]
app3:[sym1, sym3]
app2:[sym1]
app6:[sym2]
app56:[sym2]
app89:[sym2]
app887:[sym3]
}

2 个答案:

答案 0 :(得分:1)

您的setdefault代码差不多在这里,您只需要在值列表上进行一个额外的循环即可:

res = {}

for k, lst in cpc_docs.items():
    for v in lst:
        res.setdefault(v, []).append(k)

答案 1 :(得分:0)

首先创建键,值元组的列表

new_list=[]
for k,v in cpc_docs.items():
    for i in range(len(v)):
        new_list.append((k,v[i]))

然后为列表中的每个元组添加键(如果不在字典中)并添加

doc_cpc = defaultdict(set)

for tup in cpc_doc_list:
    doc_cpc[tup[1]].add(tup[0])

可能有很多更好的方法,但这可行。