【问题标题】:Create a json object and add items in a loop - python创建一个 json 对象并在循环中添加项目 - python
【发布时间】:2021-12-01 11:07:42
【问题描述】:

我也想创建一个结构化的 JSON 对象:

{
     "dataset": "xx",
     "test": "trial",
     "results": {
         "TP": 5,
         "FP": 1,
         "FN": 1,
         "TN": 2
     }
 }

我以这种方式循环计算这些结果:

json_obj = {}
for i in range(len(dictionary)):
    dataset, test = retrieve_data()
    tp, fp, tn, fn = calculate_score()
    json_obj = json.dumps({'dataset': dataset,
                            'test': test,
                            'results': {'TP': tp, 'FP': fp, 'FN': fn, 'TN': tn}})

由于我循环了 4 次,我希望得到一个像这样的 JSON 对象:

{
     "dataset": "1",
     "test": "trial1",
     "results": {
         "TP": 5,
         "FP": 3,
         "FN": 2,
         "TN": 5
     },

     "dataset": "2",
     "test": "trial2",
     "results": {
         "TP": 6,
         "FP": 4,
         "FN": 12,
         "TN": 25
     },

     "dataset": "3",
     "test": "trial3",
     "results": {
         "TP": 15,
         "FP": 1,
         "FN": 11,
         "TN": 2
     },

     "dataset": "4",
     "test": "trial4",
     "results": {
         "TP": 5,
         "FP": 11,
         "FN": 1,
         "TN": 21
     }
 }

如果我使用命令访问第一个元素:

json_obj = json.dumps(json_obj)
print (json_obj[0])

我明白了

"dataset": "1", 
"test": "trial1",
 "results": {
     "TP": 5,
     "FP": 3,
     "FN": 2,
     "TN": 5
 }

问题是,如果我运行代码,我只会得到" 作为输出。如果我打印完整的 json_obj,我会得到字符串:

"{\"dataset\": \"1\", \"test\": \"trial1\", \"results\": {\"TP\": 5, \"FP\": 3, \"FN\": 2, \"TN\": 5}}"

看起来它正在创建一个字符串而不是 json 对象。 哪里出错了?

【问题讨论】:

    标签: python json dictionary parsing


    【解决方案1】:

    当您调用json_obj = json.dumps(somthingOrOther) 时,您正在创建一个新对象并覆盖上一次迭代中的对象。所以我希望你的代码的输出字符串是:

    {"dataset": "dataSet-4", "test": 3, "results": {"TP": 9, "FP": 10, "FN": 7, "TN": 10}}
    

    注意:我对results 使用随机值。我不知道如何向 json 对象添加元素,但您可以解决它。只需将所有数据写入列表,然后使用 json.dumps 将其转换为 json 对象。看起来像这样。

    import random, json
    
    def calculate_score():
        return random.randint(0,10), random.randint(0,10),random.randint(0,10),random.randint(0,10)
    
    json_obj_list = []
    for i in range(5):
        tp, fp, tn, fn = calculate_score()
        json_obj_list .append({'dataset': f"dataSet-{i}",
                                'test': 3, #some random int
                                'results': {'TP': tp, 'FP': fp, 'FN': fn, 'TN': tn}})
    
    
    json_dump = json.dumps(json_obj_list, indent="\t")
    print(json_dump)
    

    这会打印以下内容

    [
        {
            "dataset": "dataSet-0",
            "test": 3,
            "results": {
                "TP": 9,
                "FP": 10,
                "FN": 1,
                "TN": 4
            }
        },
        {
            "dataset": "dataSet-1",
            "test": 3,
            "results": {
                "TP": 2,
                "FP": 7,
                "FN": 5,
                "TN": 2
            }
        },
        {
            "dataset": "dataSet-2",
            "test": 3,
            "results": {
                "TP": 3,
                "FP": 8,
                "FN": 5,
                "TN": 8
            }
        },
        {
            "dataset": "dataSet-3",
            "test": 3,
            "results": {
                "TP": 3,
                "FP": 5,
                "FN": 8,
                "TN": 8
            }
        },
        {
            "dataset": "dataSet-4",
            "test": 3,
            "results": {
                "TP": 3,
                "FP": 1,
                "FN": 6,
                "TN": 5
            }
        }
    ]
    

    【讨论】:

    • 我收到“AttributeError: 'str' object has no attribute 'append'” 编辑:已解决
    猜你喜欢
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多