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

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 }}"

代码解释

我们一步步拆解这个转换过程:

  1. my_dict.values() | list:提取字典所有值,得到列表的列表:[["111", "222"], ["444", "555"]]
  2. transpose:对这个列表进行转置操作,把同一位置的元素组合到一起,结果为:[["111", "444"], ["222", "555"]]
  3. map('zip', my_dict.keys()):将转置后的每个子列表和字典的键列表(['key1', 'key2'])进行配对,得到类似[('key1', '111'), ('key2', '444')]的元组列表
  4. map('dict'):把每个元组列表转换为字典(比如{'key1': '111', 'key2': '444'})
  5. list:最终将所有转换后的字典收集成列表

验证结果

执行后你会得到预期的输出:

my_list:
  - key1: "111"
    key2: "444"
  - key1: "222"
    key2: "555"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 19:42:46