PAYATHON 2026

如何在 Ansible 中将二维列表转换为字典列表?

数据小陈

结论

可以用 ansible.builtin.set_fact 初始化结果列表,再通过循环把每行的两个值分别赋给 key1 和 key2。不过,问题中的 parent_list 缩进需要先修正。按当前写法,YAML 会把它解析成四个顶层元素,而不是两行、每行两个值。

调整输入结构

将每组值缩进为同一个子列表:

parent_list:
  - - "value1-1"
    - "value1-2"
  - - "value2-1"
    - "value2-2"

这样,parent_list 才是包含两个子列表的二维列表。目标结构中,key2 应与 key1 保持相同的缩进层级:

list_of_dicts:
  - key1: "value1-1"
    key2: "value1-2"
  - key1: "value2-1"
    key2: "value2-2"

使用循环转换

在 playbook 中先初始化变量,再逐行构造字典:

- name: Initialize the result list
  ansible.builtin.set_fact:
    list_of_dicts: []

- name: Convert each row to a dictionary
  ansible.builtin.set_fact:
    list_of_dicts: "{{ list_of_dicts + [{'key1': item[0], 'key2': item[1]}] }}"
  loop: "{{ parent_list }}"

每次循环会把一个子列表赋给 item,其中 item[0] 和 item[1] 分别是这一行的两个值。执行后,list_of_dicts 会包含两个字典。

注意事项

此写法要求每个子列表都恰好包含两个元素。如果行长度可能不同,应在转换前检查数据,否则访问 item[0] 或 item[1] 时可能得不到预期结果。

备注:内容仅供参考。