将嵌套的键和值添加到 dict 对象

时间:2021-03-29 10:28:55

标签: python json dictionary

我正在尝试向 json 对象添加一个新的嵌套键,但我似乎无法使其正常工作,并且不确定我做错了什么。我也想知道这是最有效的方法吗?

def create_file(qle_folder, param_values):
    json_list= []
    files = [os.path.join(qle_folder, f) for f in os.listdir(folder) if os.path.isfile(os.path.join(qle_folder, f))]

    for filename in files: 
        with open(filename) as f:
            for l in f:
                doc = json.loads(l)
                target_length = len(doc['targets'])
                if target_length == 0:
                    continue

                labelel_dict ={}
                for i in range(target_length):
                    label = doc['targets'][i]['label'].strip().lower()
                    match = doc['targets'][i]['match'].strip().lower()
                    new_dict = {
                                'type': label,
                                 'value': match
                                }
                    key_value = str(d).strip().lower()
                    key_value = json.dumps(key_value)
                    if key_value in values_dict:
                        value = values_dict[key_value]
                        value = str(value).strip("[]\"").lower()
                        #dLabel = {"distros": {"Tags": { label: []}}}
                        label_dict[label] = value
                        
                
                doc['Options'] =''
                doc['Options']['Tags']= label_dict
                #doc['Options'] = d['Options']
                
                doc = json.dumps(doc)
                print(doc)
                json_list.append(doc + '\n')

  
    return json_list

最终文件应如下所示:

{
  "targets": [
    {
      "start": 40,
      "end": 73,
      "label": "test:image",
      "match": "the cathedral"
    }
    {
      "start": 40,
      "end": 74,
      "label": "test:text",
      "match": "some text"
    }
  ],
  "Options": {
    "Tags": {
      "test:image": [
        "test 1",
        "test 3",
        "test 4",
      ]
        "test:text": [
        "test 1",
        "test 3",
        "test 4",

      ]
    }
  }
}

value_dict 看起来像这样,包含一个由“类型”和“值”连接的键:

{"type": "test:image", "value": "the cathedral"}["['test 1']"]
{"type": "test:text", "value": "some text"}["['test 3']"]

我收到的错误是

 TypeError: 'str' object does not support item assignment 

1 个答案:

答案 0 :(得分:0)

您将 d 初始化为列表,然后尝试将其作为字典访问。 该行应该是:

d = {}

如果你需要它是一个列表,那么你需要以不同的方式设置以下几行:

new_dict = {
'type': label,
'value': match
}

看起来您还试图用双引号替换单引号,但我不知道为什么。您可以使用 json.dumps(d) 函数以 JSON 格式返回字典的有效字符串表示形式。

看来您正在将值转换为字符串,然后对它们进行评估。作为字典,您不需要这样做。我不太明白你想用 key_values 部分做什么.. 以下还不够:

for x in new-dict.keys():
  if x in key_values:
    // Do something