如何解决Jinja用于在地图[1,2]中构造字典为[{'x':1},{'x':2}]
大多数Jinja过滤器用于减少数据量。 如果我想增大尺寸会怎样?
输入
一个列表。这些值可以是简单的,也可以是复杂的。
- 1
- 'a'
- ['b','c']
- {'d': 'e'}
所需的输出
我想列出一个清单。
- 长度与输入列表相同
- 新列表中的每一项都是字典 一对(键,值)。
- 键是硬编码的,输出列表中的每个项目都相同。
- 该值是输入列表中的对应项。
- x: 1
- x: a
- x: ['b','c']
- x: {'d': 'e'}
我正在寻找的是类似的东西
{{ input | map(some_filter,key='x') | list }}
some_filter
可以用来做什么?
注释
我为此使用Ansible。
因此,将JMESPath与json_query
过滤器一起使用的解决方案是有效的。
同样,Ansible是使用dict2items
或items2dict
的解决方案,也同样有效。
解决方法
下面的任务完成了任务
- debug:
msg: "{{ input|json_query('[*].{x: @}') }}"
给予
msg:
- x: 1
- x: a
- x:
- b
- c
- x:
d: e
dict2items在这里没有用,因为输入是一个列表。 items2dict在这里也没有用,因为结果也应该是一个列表。另外,dict也是无用的,因为它不是过滤器,不能在 map
中使用。如果没有 json_query
,则必须使用 loop
。例如
- set_fact:
output: "{{ output + [{'x': item}] }}"
loop: "{{ input }}"
vars:
output: []
可以编写一个过滤器。例如
shell> cat filter_plugins/item2dict.py
def item2dict(t):
h = {t[0]:t[1]}
return h
class FilterModule(object):
''' Ansible filters. item2dict'''
def filters(self):
return {
'item2dict': item2dict
}
然后下面的任务给出相同的结果
- debug:
msg: "{{ 'x'|product(input)|map('item2dict')|list }}"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。