【问题标题】:Merge key values in list of dictionaries合并字典列表中的键值
【发布时间】:2022-12-18 08:33:43
【问题描述】:

我有一个包含字典的列表:

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"}]

我正在尝试组合这些值以最终处于这种状态:

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()}]

但是 .setdefault 只接受两个参数并输出两个。我找不到包含我的“状态”键/值的方法。如何合并此列表以获得最终结果?

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    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],
            }
        )
    

    【讨论】:

    • 这行得通!我只是希望我知道它是如何工作的哈哈
    【解决方案2】:

    在这里,我只是在所有唯一票证上循环,然后在内部创建空模板,该模板将附加到新的 final_queue 中。

    代码:

    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"}]
    final_queue =[]
    for i in set([i['ticket'] for i in start_queue]):
        dic = {'ticket': i, 'vmname': [], 'status': []}
        for s in start_queue:
            if s['ticket']==i:
                for k in ['vmname', 'status']:
                    dic[k].append(s[k])
                
        final_queue.append(dic)
    final_queue
    

    输出:

    [{'ticket': 'INC3',
      'vmname': ['dev05', 'dev06'],
      'status': ['remove', 'remove']},
     {'ticket': 'INC1', 'vmname': ['testapp01'], 'status': ['online']},
     {'ticket': 'INC2',
      'vmname': ['demo02', 'demo03', 'demo04'],
      'status': ['remove', 'remove', 'remove']}]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-25
      • 2014-12-19
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多