[英]Merge key values in list of dictionaries
我有一個包含字典的列表:
start_queue = [{"ticket": "INC1", "vmname": "testapp01", "status": "online"},
{"ticket": "INC2", "vmname": "demo02", "status": "remove"},
{"ticket": "INC2", "vmname": "demo03", "status": "remove"},
{"ticket": "INC2", "vmname": "demo04", "status": "remove"},
{"ticket": "INC3", "vmname": "dev05", "status": "remove"},
{"ticket": "INC3", "vmname": "dev06", "status": "remove"}]
我正在嘗試合並這些值以在這個 state 中結束:
final_queue = [{"ticket": "INC1", "vmname": ["testapp01"], "status": ["online"]},
{"ticket": "INC2", "vmname": ["demo02","demo3","demo4"], "status": ["remove","remove","remove"]},
{"ticket": "INC3", "vmname": ["dev05", "dev6"], "status": ["remove", "remove"]}]
我研究過像這樣使用默認字典:
tmp_dict = {}
for item in start_queue:
tmp_dict.setdefault(item['ticket', []).append(item['vmname'])
final_queue = [{'ticket': k, 'vmname': v} for k,v in tmp_dict.items()}]
But.setdefault 只接受兩個參數並輸出兩個。 我找不到包含我的“狀態”鍵/值的方法。 如何合並此列表以獲得最終結果?
itertools
來拯救:
from itertools import groupby
final_queue = []
for ticket, groups in groupby(start_queue, lambda d: d.get("ticket")):
groups = list(groups)
final_queue.append(
{
"ticket": ticket,
"vmname": [group["vmname"] for group in groups],
"status": [group["status"] for group in groups],
}
)
這是一個如何使用 pandas 模塊解決任務的示例:
import pandas as pd
pd.DataFrame(start_queue).groupby('ticket', as_index=False).agg(list).to_dict('records')
>>>
'''
[{'ticket': 'INC1', 'vmname': ['testapp01'], 'status': ['online']},
{'ticket': 'INC2', 'vmname': ['demo02', 'demo03', 'demo04'], 'status': ['remove', 'remove', 'remove']},
{'ticket': 'INC3', 'vmname': ['dev05', 'dev06'], 'status': ['remove', 'remove']}]
代碼:
final_queue =[]
for i in set([i['ticket'] for i in start_queue]): ##{'INC1', 'INC2', 'INC3'}
dic = {'ticket': i, 'vmname': [], 'status': []} ##Creating empty teamplate
for s in start_queue: ##Looping over list
if s['ticket']==i: ##If ticket same as I
for k in ['vmname', 'status']: ##looping over dict list
dic[k].append(s[k]) ##append value by key
final_queue.append(dic) ##append the whole new dic
final_queue
Output:
[{'ticket': 'INC3',
'vmname': ['dev05', 'dev06'],
'status': ['remove', 'remove']},
{'ticket': 'INC1', 'vmname': ['testapp01'], 'status': ['online']},
{'ticket': 'INC2',
'vmname': ['demo02', 'demo03', 'demo04'],
'status': ['remove', 'remove', 'remove']}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.