使用python在新字典中存储JSON_文件中的两个值
我想将JSON_文件中的两个值存储在新的dict中,如下所示:使用python在新字典中存储JSON_文件中的两个值,python,list,dictionary,Python,List,Dictionary,我想将JSON_文件中的两个值存储在新的dict中,如下所示:{[1,2,5]:[0],[1,2,4]:[2]} 我的JSON文件如下所示: { "index": [ { "timestamp": "2018-04-17 17:56:25", "src": "src", "dst": [1,2,5], "value": [0], "datatype":
{[1,2,5]:[0],[1,2,4]:[2]}
我的JSON文件如下所示:
{
"index": [
{
"timestamp": "2018-04-17 17:56:25",
"src": "src",
"dst": [1,2,5],
"value": [0],
"datatype": "datatype"
},
{
"timestamp": "2018-04-17 18:00:43",
"src": "src",
"dst": [1,2,4],
"value": [2],
"datatype": "datatype"
}
]
}
我写了这段代码:
with open(filename) as feedjson:
json_data = json.load(feedjson)
feedjson.close()
list_dev = {}
for i in json_data["index"]:
key = i['value']
value = i['dst']
list_dev[key] = value
print(list_dev)
我得到这个错误:
list_dev.update({key: value})
TypeError: unhashable type: 'list'
有人能帮我解决这个问题吗?
值
是一个列表
->[1]
或[2]
或其他什么,列表是可变对象,所以不能散列它
您可以使用列表中的元素,如
key=i['value'][0]
或者将列表转换为元组,如
key=tuple(i['value'])
这两个对象都是不可变的,因此可以散列并用作键
顺便说一句,
with
提供上下文管理器,这样您就不需要使用feedjson.close()
关闭文件,with
将为您完成此操作这只是为了理解:
正如所解释的,字典键应该是不可变的。在这个问题中,[1,2,5]
是一个可变的列表(可以使用append、pop、push等方法修改内容)数据类型。因此,将列表的全部内容用作字典键的唯一方法(非常罕见)是将其转换为不可变的数据类型,例如元组
或字符串
:
new_dict = {} #initialize empty dictionary
dst = t['index'][0]['dst'] #[1,2,5]
value = t['index'][0]['value'] #[0]
new_dict[tuple(dst)] = value #new_dict key "dst" as tuple
print(new_dict)
--->{(1, 2, 5): [0]}
new_dict[str(dst)] = value #new_dict key "dst" as string
print(new_dict)
---->{'[1, 2, 5]': [0]}
可能与我以前见过的解决方案重复。这对我解决问题没有帮助。但是,通过将值变量转换为不可变的内容,可以很容易地修复您的错误。这是原问题和你的问题的答案。谢谢你的回答。key=i['value'][0]我无法使用此选项,因为我有一个很长的JSON文件。当我将列表转换为tuple key=tuple(i['value'])时,会出现以下错误:TypeError:'int'对象不可用iterable@AhmyOhlin在
value
字段下可以显示哪些不同类型的数据?值可以是整数,通过将值转换为类型的数据来固定它“string”value=str(i['value'])key=str(i['dst'])。请将您的答案从元组修改为字符串。感谢您的帮助您的示例显示值是列表,而不是整数。列表的不可变版本是元组。我看不出他的答案有任何错误。