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

基于匹配条件合并Ansible中的两个列表(含重复元素)

解决Ansible列表匹配重复元素的合并问题

问题背景

现有两个Ansible Facts列表:

  • list1:包含重复数字的字符串列表
ansible_facts:
  list1:
    - "10"
    - "2"
    - "4"
    - "5"
    - "6"
    - "7"
    - "7"
    - "8"
    - "9"
  • list2:数字与对应文本的二维列表,数字无重复
ansible_facts:
  list2:
    - ["10", "xxxxx"]
    - ["2", "yyyyy"]
    - ["4", "zzzzz"]
    - ["5", "mmmmm"]
    - ["6", "fffff"]
    - ["7", "gggggg"]
    - ["8", "hhhhh"]
    - ["9", "kkkkkk"]

需求是将list1的每个数字与list2中对应数字的文本关联,生成包含重复项的list3,即使list1有重复数字也要正确匹配。之前尝试按索引匹配的方法(when: list1[item|int] == list2[item|int])因索引不对齐无法处理重复情况。

解决方案

核心思路是先将list2转换为数字-文本映射的字典,再遍历list1的每个元素,通过字典快速查找对应文本,生成目标列表list3。

Playbook示例

- name: 合并列表并处理重复元素
  hosts: localhost
  vars:
    # 模拟Ansible Facts中的列表
    list1:
      - "10"
      - "2"
      - "4"
      - "5"
      - "6"
      - "7"
      - "7"
      - "8"
      - "9"
    list2:
      - ["10", "xxxxx"]
      - ["2", "yyyyy"]
      - ["4", "zzzzz"]
      - ["5", "mmmmm"]
      - ["6", "fffff"]
      - ["7", "gggggg"]
      - ["8", "hhhhh"]
      - ["9", "kkkkkk"]
  tasks:
    - name: 生成list3
      set_fact:
        list3: "{{ list3 | default([]) + [[item, list2_dict[item]]] }}"
      vars:
        list2_dict: "{{ dict(list2) }}"
      loop: "{{ list1 }}"

    - name: 打印结果
      debug:
        var: list3

步骤解释

  1. 转换list2为字典:用dict(list2)过滤器将二维列表list2转为{"10": "xxxxx", "2": "yyyyy", ...}的字典结构,实现快速查找。
  2. 遍历list1生成list3:通过loop遍历list1的每个元素,每次从字典中取出对应文本,将数字和文本组合成二维列表项,逐步追加到list3中。

执行结果

生成的list3完全符合需求:

list3:
  - ["10", "xxxxx"]
  - ["2", "yyyyy"]
  - ["4", "zzzzz"]
  - ["5", "mmmmm"]
  - ["6", "fffff"]
  - ["7", "gggggg"]
  - ["7", "gggggg"]
  - ["8", "hhhhh"]
  - ["9", "kkkkkk"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:05:33