繁体   English   中英

python 根据公共键将字典列表合并为 1

[英]python merge list of dicts into 1 based on common key

我有这个字典:

data= [{'org_id': 'AGO-cbgo', 'ws_name': 'finops_enricher-nonprod', 'ws_id': 'ws-CTvV7QysPeY4Gt1Q', 'current_run': None}
{'org_id': 'AGO-cbgo', 'ws_name': 'finops_enricher-prod', 'ws_id': 'ws-s4inidN9aDxELE4a', 'current_run': None}
{'org_id': 'AGO-cbgo', 'ws_name': 'finops_enricher-preprod', 'ws_id': 'ws-fvyKv7m4FRYf8v5o', 'current_run': None}
{'org_id': 'AGO-cbgo', 'ws_name': 's3_dlp-getd_sherlock-prod', 'ws_id': 'ws-XpzzptzGHL2YNjsL', 'current_run': None}
{'org_id': 'AGO-cbgo', 'ws_name': 's3_dlp-getd_sherlock-nonprod', 'ws_id': 'ws-dksk8nnXTjzLWmRn', 'current_run': 'run-osSNuCtt5ULHPBus'}
]

我需要得到这样的结果:

    result= {'AGO-cbgo', 'ws': [
            {'ws_name': 'finops_enricher-nonprod', 'ws_id': 'ws-CTvV7QysPeY4Gt1Q', 'current_run': None},
            {'ws_name': 'finops_enricher-preprod', 'ws_id': 'ws-fvyKv7m4FRYf8v5o', 'current_run': None},
            {'ws_name': 's3_dlp-getd_sherlock-prod', 'ws_id': 'ws-XpzzptzGHL2YNjsL', 'current_run': None},
            {'ws_name': 's3_dlp-getd_sherlock-nonprod', 'ws_id': 'ws-dksk8nnXTjzLWmRn', 'current_run': 'run-osSNuCtt5ULHPBus'}
            ]
        }

知道如何实现这一目标吗? 我玩过 collections 和 defaultdict,但没有成功。

使用来自 collections 的defaultdict :将'ws'作为键并将其值作为包含具有不同属性的 sum-dict 的列表

from collections import defaultdict

res = defaultdict(list)
res["org_id"] = set([item["org_id"] for item in data])
for item in data:
    res["ws"].append({key: value for key, value in item.items() if key != "org_id"})

new_dict = dict(res)
print(new_dict)

您也可以使用以下方法在没有 defaultdict的情况下到达相同的 output:
使用zip()

org_id, ws = zip(*[(item.pop("org_id"), item) for item in data])
new_dict = {"org_id": set(org_id), "ws": list(ws)}
print(new_dict)

或者初始化字典:

new_dict = {"org_id": set(), "ws": []}
for item in data:
    new_dict["org_id"].add(item["org_id"])
    new_dict["ws"].append({key: value for key, value in item.items() if key !="org_id"})

print(new_dict)

注意:您的 output 不是正确的字典。 Bellow 是一个正确的 output,我怀疑它是您可能要求的 output。


{'org_id': {'AGO-cbgo'}, 'ws': [
    {'ws_name': 'finops_enricher-nonprod', 'ws_id': 'ws-CTvV7QysPeY4Gt1Q', 'current_run': None}, 
    {'ws_name': 'finops_enricher-prod', 'ws_id': 'ws-s4inidN9aDxELE4a', 'current_run': None}, 
    {'ws_name': 'finops_enricher-preprod', 'ws_id': 'ws-fvyKv7m4FRYf8v5o', 'current_run': None}, 
    {'ws_name': 's3_dlp-getd_sherlock-prod', 'ws_id': 'ws-XpzzptzGHL2YNjsL', 'current_run': None}, 
    {'ws_name': 's3_dlp-getd_sherlock-nonprod', 'ws_id': 'ws-dksk8nnXTjzLWmRn', 'current_run': 'run-osSNuCtt5ULHPBus'}
    ]}

使用pprint模块打印 output 将产生以下格式:

from pprint import pprint 

pprint(new_dict)

{'org_id': {'AGO-cbgo'},
 'ws': [{'current_run': None,
         'ws_id': 'ws-CTvV7QysPeY4Gt1Q',
         'ws_name': 'finops_enricher-nonprod'},
        {'current_run': None,
         'ws_id': 'ws-s4inidN9aDxELE4a',
         'ws_name': 'finops_enricher-prod'},
        {'current_run': None,
         'ws_id': 'ws-fvyKv7m4FRYf8v5o',
         'ws_name': 'finops_enricher-preprod'},
        {'current_run': None,
         'ws_id': 'ws-XpzzptzGHL2YNjsL',
         'ws_name': 's3_dlp-getd_sherlock-prod'},
        {'current_run': 'run-osSNuCtt5ULHPBus',
         'ws_id': 'ws-dksk8nnXTjzLWmRn',
         'ws_name': 's3_dlp-getd_sherlock-nonprod'}]}

这应该可以解决问题,而不会改变原始数据:

from pprint import pprint

data = [
    {'org_id': 'AGO-cbgo', 'ws_name': 'finops_enricher-nonprod', 'ws_id': 'ws-CTvV7QysPeY4Gt1Q', 'current_run': None},
    {'org_id': 'AGO-cbgo', 'ws_name': 'finops_enricher-prod', 'ws_id': 'ws-s4inidN9aDxELE4a', 'current_run': None},
    {'org_id': 'AGO-cbgo', 'ws_name': 'finops_enricher-preprod', 'ws_id': 'ws-fvyKv7m4FRYf8v5o', 'current_run': None},
    {'org_id': 'AGO-cbgo', 'ws_name': 's3_dlp-getd_sherlock-prod', 'ws_id': 'ws-XpzzptzGHL2YNjsL', 'current_run': None},
    {'org_id': 'AGO-cbgo', 'ws_name': 's3_dlp-getd_sherlock-nonprod', 'ws_id': 'ws-dksk8nnXTjzLWmRn', 'current_run': 'run-osSNuCtt5ULHPBus'},
]

new_data = {}

for d in data:
    # copy the dict to prevent mutating the original data
    d_copy = dict(**d)
    d_copy.pop('org_id')
    # add the copied dict to the output, creating keys as needed
    new_data.setdefault(d['org_id'], []).append(d_copy)

pprint(new_data)

结果:

{'AGO-cbgo': [{'current_run': None,
               'ws_id': 'ws-CTvV7QysPeY4Gt1Q',
               'ws_name': 'finops_enricher-nonprod'},
              {'current_run': None,
               'ws_id': 'ws-s4inidN9aDxELE4a',
               'ws_name': 'finops_enricher-prod'},
              {'current_run': None,
               'ws_id': 'ws-fvyKv7m4FRYf8v5o',
               'ws_name': 'finops_enricher-preprod'},
              {'current_run': None,
               'ws_id': 'ws-XpzzptzGHL2YNjsL',
               'ws_name': 's3_dlp-getd_sherlock-prod'},
              {'current_run': 'run-osSNuCtt5ULHPBus',
               'ws_id': 'ws-dksk8nnXTjzLWmRn',
               'ws_name': 's3_dlp-getd_sherlock-nonprod'}]}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM