如何在 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] 时可能得不到预期结果。
备注:内容仅供参考。
