You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并字典列表中相同ticket对应的vmname与status值?

问题描述

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

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","demo03","demo04"], "status": ["remove","remove","remove"]},
               {"ticket": "INC3", "vmname": ["dev05", "dev06"], "status": ["remove", "remove"]}]

我尝试了以下代码,但setdefault只能处理一个值,没法同时处理status:

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

请问该怎么实现预期的合并效果?

解决方案

方法一:基础循环处理

用临时字典存储每个ticket对应的合并结构,遍历原列表时,若ticket已存在则追加vmname和status到对应列表,不存在则初始化结构:

tmp_dict = {}
for item in start_queue:
    ticket = item['ticket']
    # 如果ticket不在临时字典里,初始化对应的结构
    if ticket not in tmp_dict:
        tmp_dict[ticket] = {
            'ticket': ticket,
            'vmname': [],
            'status': []
        }
    # 追加当前项的vmname和status到对应列表
    tmp_dict[ticket]['vmname'].append(item['vmname'])
    tmp_dict[ticket]['status'].append(item['status'])

# 把临时字典的值转成列表就是最终结果
final_queue = list(tmp_dict.values())

逻辑清晰,容易理解,运行后就能得到预期结果。

方法二:用collections.defaultdict简化代码

借助collections模块的defaultdict自动初始化每个ticket对应的结构,省去判断步骤:

from collections import defaultdict

tmp_dict = defaultdict(lambda: {'ticket': '', 'vmname': [], 'status': []})
for item in start_queue:
    ticket = item['ticket']
    entry = tmp_dict[ticket]
    entry['ticket'] = ticket
    entry['vmname'].append(item['vmname'])
    entry['status'].append(item['status'])

final_queue = list(tmp_dict.values())

补充说明

你之前的代码有个语法错误:item['ticket', []]应该写成item['ticket'],不过即使修正,也只能处理vmname字段。上面两种方法都能同时处理vmname和status两个字段的合并需求。

内容的提问来源于stack exchange,提问作者itinneed2022_1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 06:01:46