Ansible技术求助:如何将含列表值的字典转换为对应索引配对的字典列表
Ansible: Convert Dictionary of Lists to List of Dictionaries
你的需求是把一个键对应列表的字典,转换成每个元素是对应位置键值对的字典列表,这个场景在Ansible里其实可以通过值列表转置+键值配对来实现,先分析下你原代码的问题,再给出解决方案:
原代码问题分析
你用dict2items | subelements('value')遍历的是每个键的每个单独元素,每次循环只会生成一个仅包含单个键的字典(比如{"key1": "111"}),然后逐个追加到列表里,自然得到的是一堆单键字典的集合,和预期的合并后字典列表不符。
解决方案
核心思路是:先把字典中所有值的列表进行转置,让每个位置的元素聚在一起,再和对应的键配对生成完整的字典。
方法1:用set_fact循环实现
- name: Convert dict of lists to list of dicts set_fact: my_list: "{{ my_list | default([]) + [dict(zip(my_dict.keys(), item))] }}" loop: "{{ my_dict.values() | list | transpose }}"
方法2:一行过滤器链式调用(更简洁)
可以直接用Ansible的过滤器组合完成转换,不需要循环:
- name: Define converted list directly set_fact: my_list: "{{ my_dict.values() | list | transpose | map('zip', my_dict.keys()) | map('dict') | list }}"
代码解释
我们一步步拆解这个转换过程:
my_dict.values() | list:提取字典所有值,得到列表的列表:[["111", "222"], ["444", "555"]]transpose:对这个列表进行转置操作,把同一位置的元素组合到一起,结果为:[["111", "444"], ["222", "555"]]map('zip', my_dict.keys()):将转置后的每个子列表和字典的键列表(['key1', 'key2'])进行配对,得到类似[('key1', '111'), ('key2', '444')]的元组列表map('dict'):把每个元组列表转换为字典(比如{'key1': '111', 'key2': '444'})list:最终将所有转换后的字典收集成列表
验证结果
执行后你会得到预期的输出:
my_list: - key1: "111" key2: "444" - key1: "222" key2: "555"
内容的提问来源于stack exchange,提问作者Marisol
相关产品推荐
相关产品推荐

