我正在尝试用Python创建一个倒置字典
import json
def readfile():
with open('/home/krishna/Desktop/data/synonyms.json', 'r') as f:
read_data = f.read()
j = json.loads(read_data)
inverted_dict = dict([v,k] for k,v in j.items())
if __name__ == "__main__":
readfile()
同义词文本文件有:
{
viral fever: [
"fever",
"viral fever"
],
sickness: [
"acute sickness",
"typhoid"
],..
}
我面临的错误是:
File "/home/krishna/Desktop/Scripts/jsonparse.py", line 7, in readfile
inverted_dict = dict([v,k] for k,v in j.items())
TypeError: unhashable type: 'list'
我的预期输出
字典fever: viral fever
viral fever: viral fever
acute sickness: sickness
typhoid: sickness
答案 0 :(得分:2)
你的价值观是清单;您需要显式遍历每个值的元素以生成这些单独的键:
dict((i, k) for k, v in j.items() for i in v)
如果你使用的是Python 2.7或3,你也可以在这里使用字典理解:
{i: k for k, v in j.items() for i in v}
此可以导致重复的条目,只有最后一个条目会“粘贴”。如果多个值中存在重复值(fever
和sickness
的列表中都有viral fever
,则您需要使用set
构建字典或而是list
值:
from collections import defaultdict
result = defaultdict(set)
for k, v in j.items():
for i in v:
result[i].add(k)
答案 1 :(得分:0)
列表["fever", "viral fever"]
不是dict的有效密钥,因为它是可变的。
你可能想要:
"fever"
和"viral fever"
作为引用相同值的单独键,("fever", "viral fever")
或冻结集frozenset(["fever", "viral fever"])
而不是列表作为dict键。 (套装没有订单。)