如何将字典应用到有金甲过滤器的项目列表中?



我有一个项目列表,它们在某个字典中都以键的形式出现。我想使用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

如果你运行这个,你得到:

fatal: [localhost]: FAILED!=比;{"msg": "模板化"{{my_list | map(my_dict) | list}}"时发生未处理的异常。错误是一个<类'ValueError'>,原始消息:键必须是字符串"}

我想修改actual:行,使这个剧本没有错误。

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

给定列表

my_list: [a, c]

使用过滤器提取物

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

应该给

actual: [1, 3]

当列表中的某些项在字典中缺失时,上述解决方案不起作用。例如,

my_list: [a, c, x]

将会失败

" dict对象"没有属性"x">

在本例中,选择列表中的键。下面的表达式给出了相同的结果

actual: "{{ my_dict|dict2items|
selectattr('key', 'in', my_list)|
map(attribute='value')|list }}"

测试

的完整剧本示例
- hosts: localhost
vars:
my_list: [a, c]
my_dict:
a: 1
b: 2
c: 3
actual1: "{{ my_list|map('extract', my_dict)|list }}"
actual2: "{{ my_dict|dict2items|
selectattr('key', 'in', my_list)|
map(attribute='value')|list }}"
tasks:
- debug:
var: actual1|to_yaml
- debug:
var: actual2|to_yaml

相关内容

  • 没有找到相关文章

最新更新