簡體   English   中英

合並字典列表中的鍵值

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM