所以,我把这个索引作为一个词典。
index = {'Testfil2.txt': ['nisse', 'hue', 'abe', 'pind'], 'Testfil1.txt': ['hue', 'abe',
'tosse', 'svend']}
我需要反转索引,因此它将是一个带有重复值的dict,并将两个原始键合并为一个键,如下所示:
inverse = {'nisse' : ['Testfil2.txt'], 'hue' : ['Testfil2.txt', 'Testfil1.txt'],
'abe' : ['Testfil2.txt', 'Testfil1.txt'], 'pind' : ['Testfil2.txt'], 'tosse' :
['Testfil1.txt'], 'svend' : ['Testfil1.txt']
是的,我手动输入上述内容。
我的教科书具有反转词典的功能:
def invert_dict(d):
inverse = dict()
for key in d:
val = d[key]
if val not in inverse:
inverse[val] = [key]
else:
inverse[val].append(key)
return inverse
它适用于简单的键:值对
但是,当我尝试使用包含列表作为我的index
等值的dict的函数时,我收到此错误消息:
invert_dict(index)
Traceback (most recent call last):
File "<pyshell#153>", line 1, in <module>
invert_dict(index)
File "<pyshell#150>", line 5, in invert_dict
if val not in inverse:
TypeError: unhashable type: 'list'
我已经搜索了一个小时寻找解决方案,这本书没有帮助,我怀疑我可以用某种方式使用元组,但我不确定如何。有什么帮助吗?
答案 0 :(得分:7)
我的反向词典解决方案,如何创建新词典new_dic
:
new_dic = {}
for k,v in index.items():
for x in v:
new_dic.setdefault(x,[]).append(k)
输出:
{'tosse': ['Testfil1.txt'], 'nisse': ['Testfil2.txt'], 'svend': ['Testfil1.txt'], 'abe': ['Testfil1.txt', 'Testfil2.txt'], 'pind': ['Testfil2.txt'], 'hue': ['Testfil1.txt', 'Testfil2.txt']}
答案 1 :(得分:3)
我已经尝试过你想要使用val not in inverse
但是无法检查“列表是否在dict中”。 (val
是一个列表)
对于您的代码,一个简单的更改将执行您想要的操作:
def invert_dict(d):
inverse = dict()
for key in d:
# Go through the list that is saved in the dict:
for item in d[key]:
# Check if in the inverted dict the key exists
if item not in inverse:
# If not create a new list
inverse[item] = [key]
else:
inverse[item].append(key)
return inverse
答案 2 :(得分:1)
您不能将list
个对象用作字典键,因为它们应该是可清除的对象。您可以遍历项目并使用dict.setdefault
方法创建预期结果:
>>> new = {}
>>>
>>> for k,value in index.items():
... for v in value:
... new.setdefault(v,[]).append(k)
...
>>> new
{'hue': ['Testfil2.txt', 'Testfil1.txt'], 'svend': ['Testfil1.txt'], 'abe': ['Testfil2.txt', 'Testfil1.txt'], 'tosse': ['Testfil1.txt'], 'pind': ['Testfil2.txt'], 'nisse': ['Testfil2.txt']}
如果你正在处理更大的数据集以拒绝在每次调用setdefault()
方法时调用创建空列表,你可以使用collections.defaultdict()
,它会在遇到新密钥时调用缺失的函数
from collections import defaultdict
new = defaultdict(list)
for k,value in index.items():
for v in value:
new[v].append(k)
>>> new
defaultdict(<type 'list'>, {'hue': ['Testfil2.txt', 'Testfil1.txt'], 'svend': ['Testfil1.txt'], 'abe': ['Testfil2.txt', 'Testfil1.txt'], 'tosse': ['Testfil1.txt'], 'pind': ['Testfil2.txt'], 'nisse': ['Testfil2.txt']})