【问题标题】:How to convert from lists to json in python?如何在python中从列表转换为json?
【发布时间】:2021-01-26 17:44:16
【问题描述】:

我的嵌套循环所需的输出是 json,如何到达那里?

输入列表结构看起来像 list = [[name, version, id],[name, version, id], ...]

list_1 = [
['mipl-abnd','v1.0.2','eelp234'],
['mipl-avfd','v1.1.5','32fv423'],
['mipl-awsd','v9.0.2','234eelp'],
['mipl-tgfd','v3.0.0','124fdge'],
['mipl-hrdss','v1.0.2','543rfd3'],
['mipl-oldss','v1.0.2','eelp234']] 

list_2 = [
['mipl-abnd','v1.0.2','eelp234'],
['mipl-avfd','v1.1.6','3254323'],
['mipl-awsd','v9.0.2','234eelp'],
['mipl-tgfd','v3.0.0','124fdge'],
['mipl-hrdss','v1.0.2','543rfd3'],
['mipl-newss','v1.0.2','eelp234']] 

这是我用来获取最终列表的代码:

def get_difference(l1,l2):
    l1 = get_ordered_list(file1.read())     
    l2 = get_ordered_list(file2.read()) 

    d1 = {k:[v1,v2] for k,v1,v2 in l1}
    d2 = {k:[v1,v2] for k,v1,v2 in l2}
    result = []
    for k,v in d2.items():
        if k in d1:
            v1 = d1[k]
            if v1[0] != v[0]:
                result.append({k,v1[0],v[0], v1[1],v[1]})
        else:
            result.append({k,'new',v[0],'new', v[1]})

    for k,v in d1.items():
        if k not in d2:
            result.append({k,v[0],'deprecated', v[1], 'deprecated'})
    
    res_json = json.dumps(result)
    return res_json

电流输出:

result = [['mipl-avfd', 'v1.1.5', 'v1.1.6','32fv423', '3254323'], ['mipl-oldss','v1.0.2', 'deprecated','eelp234', 'deprecated'], ['mipl-newss', 'new','v1.0.2','new', 'eelp234']]

必需的输出(我想把它写成一个易于阅读的 JSON,以后可以做成表格):

{diff = {"name" : "mipl-avfd", 
         "old-version" : "v1.1.5", 
         "new-version" : "v1.1.6",
         "old-id" : "32fv423",
         "new-id" : "3254323"
         }, 
         {"name" : "mipl-oldss", 
         "old-version" : "v1.0.2", 
         "new-version" : "deprecated",
         "old-id" : "eelp234",
         "new-id" : "deprecated"
         },
         {"name" : "mipl-newss", 
         "old-version" : "new", 
         "new-version" : "v1.0.2",
         "old-id" : "eelp234",
         "new-id" : "new"
         }

}

【问题讨论】:

  • {k,v1[0],v[0], v1[1],v[1]} 和所有像这样的结构创建 sets,而不是字典

标签: python json list dictionary nested


【解决方案1】:
  1. 你说的json不是有效的json。此外, json 是一个字符串 - 你想要一个 dict 结构。您不必将其转储为 json 字符串。
  2. 为什么在第一行覆盖 l1 和 l2 作为函数的参数?
  3. file1 和 file2 未在函数中定义。此外,要读取文件,您应该使用with 正确关闭文件。

首先,您需要在某处声明键(标签):

keys = ["name", "old-version", "old-id", "new-id"]

然后,不是附加一个列表,而是附加一个字典。

谢天谢地,字典可以很容易地从元组列表中创建 - 我们可以轻松地将键和您当前的列表合并到元组列表中,例如:

dict(zip(keys, [k,v1[0],v[0], v1[1],v[1]]))

所以它现在看起来像这样:

    for k,v in d2.items():
        if k in d1:
            v1 = d1[k]
            if v1[0] != v[0]:
                result.append(dict(zip(keys, [k,v1[0],v[0], v1[1],v[1]])))
        else:
            result.append(dict(zip(keys, [k,'new',v[0],'new', v[1]])))
    for k,v in d1.items():
        if k not in d2:
            result.append(dict(zip(keys, [k,v[0],'deprecated', v[1], 'deprecated'])))

【讨论】:

    【解决方案2】:

    希望我能正确理解您的问题。您有“旧”list_1 和“新”list_2,并且您想构建平面列表,这些版本如何变化(我假设在 list_1 中您有旧版本):

    import json
    from itertools import groupby
    
    
    list_1 = [
    ['mipl-abnd','v1.0.2','eelp234'],
    ['mipl-avfd','v1.1.5','32fv423'],
    ['mipl-awsd','v9.0.2','234eelp'],
    ['mipl-tgfd','v3.0.0','124fdge'],
    ['mipl-hrdss','v1.0.2','543rfd3'],
    ['mipl-oldss','v1.0.2','eelp234']]
    
    list_2 = [
    ['mipl-abnd','v1.0.2','eelp234'],
    ['mipl-avfd','v1.1.6','3254323'],
    ['mipl-awsd','v9.0.2','234eelp'],
    ['mipl-tgfd','v3.0.0','124fdge'],
    ['mipl-hrdss','v1.0.2','543rfd3'],
    ['mipl-newss','v1.0.2','eelp234']]
    
    
    s = sorted(list_1 + list_2, key=lambda k: k[0])
    
    out = []
    for v, g in groupby(s, lambda k: k[0]):
        g = list(g)
        if len(g) == 2:
            out.append({
                'name': v,
                'old-version': g[0][1],
                'new-version': g[1][1],
                'old-id': g[0][2],
                'new-id': g[1][2],
            })
        else:
            if g[0] in list_1:
                out.append({
                    'name': v,
                    'old-version': g[0][1],
                    'new-version': 'deprecated',
                    'old-id': g[0][2],
                    'new-id': 'deprecated',
                })
            else:
                out.append({
                    'name': v,
                    'old-version': 'new',
                    'new-version': g[0][1],
                    'old-id': 'new',
                    'new-id': g[0][2],
                })
    
    print(json.dumps(out, indent=4))
    

    打印:

    [
        {
            "name": "mipl-abnd",
            "old-version": "v1.0.2",
            "new-version": "v1.0.2",
            "old-id": "eelp234",
            "new-id": "eelp234"
        },
        {
            "name": "mipl-avfd",
            "old-version": "v1.1.5",
            "new-version": "v1.1.6",
            "old-id": "32fv423",
            "new-id": "3254323"
        },
        {
            "name": "mipl-awsd",
            "old-version": "v9.0.2",
            "new-version": "v9.0.2",
            "old-id": "234eelp",
            "new-id": "234eelp"
        },
        {
            "name": "mipl-hrdss",
            "old-version": "v1.0.2",
            "new-version": "v1.0.2",
            "old-id": "543rfd3",
            "new-id": "543rfd3"
        },
        {
            "name": "mipl-newss",
            "old-version": "new",
            "new-version": "v1.0.2",
            "old-id": "new",
            "new-id": "eelp234"
        },
        {
            "name": "mipl-oldss",
            "old-version": "v1.0.2",
            "new-version": "deprecated",
            "old-id": "eelp234",
            "new-id": "deprecated"
        },
        {
            "name": "mipl-tgfd",
            "old-version": "v3.0.0",
            "new-version": "v3.0.0",
            "old-id": "124fdge",
            "new-id": "124fdge"
        }
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-03
      • 2014-03-03
      • 2019-06-12
      • 2020-07-19
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多