反向Python字典JSON

时间:2014-03-19 10:52:22

标签: python python-2.7

我正在尝试用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

2 个答案:

答案 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}

可以导致重复的条目,只有最后一个条目会“粘贴”。如果多个值中存在重复值(feversickness的列表中都有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键。 (套装没有订单。)