【问题标题】:Best way to exchange keys with values in a dictionary, where values are in a list?与字典中的值交换键的最佳方法,值在列表中?
【发布时间】:2019-06-20 21:12:56
【问题描述】:

我的 dict (cpc_docs) 的结构类似于

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

我的 dict 有 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]
}

【问题讨论】:

  • 提示:首先将 {a: [b, c...],..} 转换为对列表,例如 [(a, b), (a, c),..],然后构建一个类似 {b: [a], c: [a],...} 的字典。每一步都很简单。
  • 啊,好主意。一对多改为一对一
  • @9000 任何关于按每个集合的长度对从下面的代码创建的 dict 进行排序的提示?
  • @Britt:虽然现在可以在 Python 3.6+ 中为字典排序(因为它们保留了插入顺序),但依赖它通常是个坏主意,因为它是 Python 中的一个新特性。在早期版本中,字典的迭代顺序是一个实现细节,并且可以随着更多项目的添加或删除而改变。对于大多数字典操作(索引),顺序并不重要。
  • 在我的用例中,顺序很重要。现在我有一个按值集的长度排序的字典,我想搜索一个特定的值并在其值集中获取所有具有该值的键。这里的键是文档,值集是该文档的分类。因此,通过根据集合的长度进行排序,我会在列表的开头获得更多相关文档。

标签: python-3.x dictionary


【解决方案1】:

您的setdefault 代码几乎就在那里,您只需要对值列表进行一个额外的循环:

res = {}

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

【讨论】:

  • 这是做什么的?这会取代第二个代码块吗?它是按设定的长度排序的吗?
  • 哦,等等 - 我看到您正在更改问题中的代码
【解决方案2】:

首先创建一个键值元组列表

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])

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

【讨论】:

    猜你喜欢
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 2023-01-28
    • 2015-10-18
    • 2016-11-29
    相关资源
    最近更新 更多