【发布时间】: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