首页 > 解决方案 > 如何使用 Jinja 过滤器将字典应用于项目列表?

问题描述

我有一个项目列表,它们都显示为某个字典中的键。我想使用 Jinja2 过滤器在字典中查找每个列表项并在列表中返回相应的值。

在 python 中,这将是:

[my_dict[x] for x in my_list]

Jinja 等价物是什么?

my_list | map(my_dict)不起作用。

这是一个示例剧本。

---
- hosts: localhost
  connection: local
  vars:
    my_dict:
      a: 1
      b: 2
      c: 3
    my_list:
      - a
      - c
  tasks:
  - assert:
      that: 
      - "{{ actual == expected }}"
    vars:
      # [my_dict[x] for x in my_list]
      actual: "{{ my_list | map(my_dict) | list }}"
      expected:
        - 1
        - 3

如果你运行它,你会得到:

致命的:[本地主机]:失败!=> {"msg": "在模板 '{{ my_list | map(my_dict) | list }}' 时发生未处理的异常。错误是 <class 'ValueError'>,原始消息:键必须是字符串"}

我想修改该actual:行,以使该剧本可以正常运行。

请注意,我不想在 Ansible 本身中循环。这是一个简单的 MWE。在我的真实示例中,此查找应该内联在一个更大的模板文件中。

标签: dictionaryansiblemappingjinja2

解决方案


使用过滤器提取物

  actual: "{{ my_list|map('extract', my_dict)|list }}"

应该给

  actual: [1, 3]

推荐阅读