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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:40:55