【问题标题】:Merge Json with same key value pairs合并具有相同键值对的 Json
【发布时间】:2022-01-06 08:11:07
【问题描述】:

我从 API 获得了一个结果 json,格式如下

[{
        "Uid": "40cc6103-1cf0-4735-b882-d14d32018e58",
        "Id": "9e1a0057-4570-4a6e-8ff5-88b2facbaf4e",
        "Details": {
            "Name": "Kiran"
        }
    }, {
        "Uid": "40cc6103-1cf0-4735-b882-d14d32018e58",
        "Id": "9e1a0057-4570-4a6e-8ff5-88b2facbaf4e",
        "Details": {
            "Age": "24"
        }
    },
    {
        "Uid": "196f5865-e9fe-4847-86ae-97d0bf57b816",
        "Id": "84909ecb-c92e-48a7-bcaa-d478bf3a9220",
        "Details": {
            "Name": "Shreyas"
        }
    }
]

由于多个整体的 Uid 和 Id 相同,我可以将它们组合在一起,Details 键是逗号分隔的键值对吗?如下所述

[{
    "Uid": "40cc6103-1cf0-4735-b882-d14d32018e58",
    "Id": "9e1a0057-4570-4a6e-8ff5-88b2facbaf4e",
    "Details": {
        "Name": "Kiran",
        "Age": "24"
    }
},
{
    "Uid": "196f5865-e9fe-4847-86ae-97d0bf57b816",
    "Id": "84909ecb-c92e-48a7-bcaa-d478bf3a9220",
    "Details": {
        "Name": "Shreyas"
    }
}]

请指导我了解要遵循的方法。谢谢

【问题讨论】:

  • 您可以简单地创建另一个 defaultdict 对象,其键具有 UID 和 Id 对。然后为每个对象添加该字典中的详细信息。

标签: python json python-3.x list dictionary


【解决方案1】:

你需要的是字典函数update()。这是一个例子:

A = [{
    "Uid": "40cc6103-1cf0-4735-b882-d14d32018e58",
    "Id": "9e1a0057-4570-4a6e-8ff5-88b2facbaf4e",
    "Details": {
        "Name": "Kiran"
    }
}, {
    "Uid": "40cc6103-1cf0-4735-b882-d14d32018e58",
    "Id": "9e1a0057-4570-4a6e-8ff5-88b2facbaf4e",
    "Details": {
        "Age": "24"
    }
},
    {
        "Uid": "196f5865-e9fe-4847-86ae-97d0bf57b816",
        "Id": "84909ecb-c92e-48a7-bcaa-d478bf3a9220",
        "Details": {
            "Name": "Shreyas"
    }
}
]

B = []

def find(uid, id_):
    for i, d in enumerate(B):
        if d['Uid'] == uid and d['Id'] == id_:
            return i
    return -1

for d in A:
    if (i := find(d['Uid'], d['Id'])) < 0:
        B.append(d)
    else:
        B[i]['Details'].update(d['Details'])

print(B)

美化输出:

[
    {
        "Uid": "40cc6103-1cf0-4735-b882-d14d32018e58",
        "Id": "9e1a0057-4570-4a6e-8ff5-88b2facbaf4e",
        "Details": {
            "Name": "Kiran",
            "Age": "24"
        }
    },
    {
        "Uid": "196f5865-e9fe-4847-86ae-97d0bf57b816",
        "Id": "84909ecb-c92e-48a7-bcaa-d478bf3a9220",
        "Details": {
            "Name": "Shreyas"
        }
    }
]

注意:

如果您的 API 响应包含大量字典,这可能会非常低效。您可能需要一种完全不同的方法

【讨论】:

  • 当 UId 和 Id 在所有情况下都相同时,这可以正常工作,如果它们不同怎么办?请帮助我的方法
  • 您对原始问题进行了重大更改。你知道如何按值检查字典的内容吗?这将是至关重要的
  • 是的,这就是我在解决这个问题时遇到的障碍
  • 我已根据您的新要求编辑了答案
【解决方案2】:

您应该遍历列表并以 (Uid, Id) 为键与累加器合并:

from typing import Dict, List

l = [{
        "Uid": "40cc6103-1cf0-4735-b882-d14d32018e58",
        "Id": "9e1a0057-4570-4a6e-8ff5-88b2facbaf4e",
        "Details": {
            "Name": "Kiran"
        }
    }, {
        "Uid": "40cc6103-1cf0-4735-b882-d14d32018e58",
        "Id": "9e1a0057-4570-4a6e-8ff5-88b2facbaf4e",
        "Details": {
            "Age": "24"
        }
    },
    {
        "Uid": "196f5865-e9fe-4847-86ae-97d0bf57b816",
        "Id": "84909ecb-c92e-48a7-bcaa-d478bf3a9220",
        "Details": {
            "Name": "Shreyas"
        }
    }
]


def mergeItem(it: Dict, acc: Dict) -> Dict:
    uid = it["Uid"]
    id = it["Id"]
    if (uid, id) in acc:
        acc[(uid, id)] = {"Uid": uid, "Id": id, "Details": {**acc[(uid, id)]["Details"], **it["Details"]}}
    else:
        acc[(uid, id)] = {"Uid": uid, "Id": id, "Details": it["Details"]}
    return acc


def mergeList(a:List) -> Dict:
    acc = {}
    for v in a:
        acc = mergeItem(v, acc)
    return acc


print(list(mergeList(l).values()))

# [
#     {
#         'Uid': '40cc6103-1cf0-4735-b882-d14d32018e58',
#         'Id': '9e1a0057-4570-4a6e-8ff5-88b2facbaf4e',
#         'Details': {'Name': 'Kiran', 'Age': '24'}},
#     {
#         'Uid': '196f5865-e9fe-4847-86ae-97d0bf57b816',
#         'Id': '84909ecb-c92e-48a7-bcaa-d478bf3a9220',
#         'Details': {'Name': 'Shreyas'}
#     }
# ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 2016-12-29
    • 2022-11-01
    • 1970-01-01
    • 2021-03-22
    • 2020-06-03
    • 1970-01-01
    相关资源
    最近更新 更多