Ansible中基于多键值匹配合并字典列表并累加指定字段
Ansible 多键匹配合并字典列表并累加字段值
实现思路
通过groupby过滤器按ru和code的组合键对字典列表分组,再遍历每个分组累加usg_amt字段,同时保留其他字段(假设同分组内其他字段值一致)。
示例输入数据
input_list: - ru: "RU001" code: "CD001" usg_amt: 100 desc: "A类资源" - ru: "RU001" code: "CD001" usg_amt: 200 desc: "A类资源" - ru: "RU002" code: "CD002" usg_amt: 150 desc: "B类资源" - ru: "RU001" code: "CD003" usg_amt: 50 desc: "C类资源"
处理任务代码
- name: 合并字典并累加usg_amt set_fact: merged_result: "{{ merged_result | default([]) + [ merged_item ] }}" loop: "{{ input_list | groupby(lambda x: (x['ru'], x['code'])) }}" vars: group_items: "{{ item.1 }}" merged_item: ru: "{{ group_items[0]['ru'] }}" code: "{{ group_items[0]['code'] }}" usg_amt: "{{ group_items | sum(attribute='usg_amt') }}" desc: "{{ group_items[0]['desc'] }}" # 保留同分组内的其他字段 - name: 输出合并结果 debug: var: merged_result
预期输出结果
merged_result: - ru: "RU001" code: "CD001" usg_amt: 300 desc: "A类资源" - ru: "RU002" code: "CD002" usg_amt: 150 desc: "B类资源" - ru: "RU001" code: "CD003" usg_amt: 50 desc: "C类资源"
关键说明
- 分组逻辑:使用
lambda x: (x['ru'], x['code'])作为分组键,确保只有ru和code同时匹配的字典才会被分到同一组,避免字符串拼接可能导致的键冲突问题。 - 字段累加:通过
sum(attribute='usg_amt')对分组内所有字典的usg_amt字段求和。 - 其他字段处理:直接取分组内第一个字典的其他字段值,若同分组内其他字段存在差异,可根据需求调整(如合并所有唯一值等)。
内容的提问来源于stack exchange,提问作者Vinny
相关产品推荐
相关产品推荐

