json 将Python字典值转换为嵌套键

5us2dqdw  于 2023-03-31  发布在  Python
关注(0)|答案(2)|浏览(133)

我有以下字典:

{'expert_interests': "['Machine learning', 'deep learning']"}

正如你所看到的,键“expert_interests”的值是字符串“['Machine learning','deep learning']"。
我想把这个字符串值转换成一个嵌套的字典,这样字典看起来就像这样:

{'expert_interests': [
      {
        "title": "Machine learning"
      },
      {
        "title": "deep learning"
        
      }
      
    ]
    }

我不知道如何处理这个问题。任何帮助都是高度赞赏的

jq6vz3qz

jq6vz3qz1#

最好的选择是使用ast.literal_eval。这个函数类似于eval,除了它只计算字面量,所以它更安全。
从文档(上面链接)中,
它没有命名空间,没有名称查找,也没有调用的能力。但它并不是没有攻击:相对较小的输入可能导致内存耗尽或C堆栈耗尽,导致进程崩溃。在某些输入上也可能出现CPU消耗过多的拒绝服务。因此不建议在不受信任的数据上调用它。

import ast

data = {'expert_interests': "['Machine learning', 'deep learning']"}

data["expert_interests"] = [
  {"title": title}
  for title
  in ast.literal_eval(data["expert_interests"])
]

print(data)
# {'expert_interests': [{'title': 'Machine learning'}, {'title': 'deep learning'}]}

另一种选择是使用json.loads将其转换为字符串列表,然后将每个字符串都作为字典。
唯一的问题是,它盲目地用"替换'(因为JSON标准只对字符串使用"),如果字符串中的任何地方都有"\',这可能会导致错误,但这比eval好,因为eval is dangerous特别是当你不能信任源时。

import json

data = {'expert_interests': "['Machine learning', 'deep learning']"}

data["expert_interests"] = [
  {"title": title}
  for title
  in json.loads(data["expert_interests"].replace("'", '"'))
  # only use this line (instead of above) if you trust the source of this data
  # in eval(data["expert_interests"])
]

print(data)
# {'expert_interests': [{'title': 'Machine learning'}, {'title': 'deep learning'}]}
zlhcx6iw

zlhcx6iw2#

您可以使用ast.literal_eval将值转换为字符串列表,并使用列表解析从它创建dicts列表。

from ast import literal_eval
d = {'expert_interests': "['Machine learning', 'deep learning']"}
d['expert_interests'] = [{"title" : t} for t in literal_eval(d['expert_interests'])]
print(d) 
# {'expert_interests': [{'title': 'Machine learning'}, {'title': 'deep learning'}]}

相关问题