[英]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.