如何合并字典列表中相同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
相关产品推荐
相关产品推荐

