Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python在新字典中存储JSON_文件中的两个值_Python_List_Dictionary - Fatal编程技术网

使用python在新字典中存储JSON_文件中的两个值

使用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":

我想将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": "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'])。请将您的答案从元组修改为字符串。感谢您的帮助您的示例显示值是列表,而不是整数。列表的不可变版本是元组。我看不出他的答案有任何错误。