我想将字典的值转换为字符串并小写,然后映射到dict上,用=
连接每个项对,然后用,
连接项。
示例输入:
{"A": "Aardvark", "B": "Beaver", "C": "Cat"}
期望输出:
A=aardvark,B=beaver,C=cat
实际上,我不在乎A、B、C的到达顺序,但我想确保键和值最终不会混淆,即没有A=cat
或其他什么。
我现在要做的是:
{{ foo.keys() | zip(foo.values() | map("lower")) | map("join", "=") | join(",") }}
到目前为止,根据我提供的测试数据,它是有效的。然而,我不确定这是否保证是正确的,我也不认为这是解决这个问题的最有效或最优雅的方法是否有更好的方法将lower
函数映射到dict中的值?
我尝试使用dict2items
并在map
函数上指定一个attribute
,但当我这样做时,我得到了一个关于意外关键字arg的错误,而且它真的很难看:
{{ (foo | dict2items | map("lower", attribute="value") | list | items2dict).items() | map("join", "=") | join(",") }}
注意:我现在在Python 3.5上使用Ansible 2.9,但我真的希望有一个无论Python版本如何都能工作的解决方案
您可以使用自定义过滤器。
在您的剧本文件夹中创建一个filter_plugins/
文件夹(我已将文件命名为myfilters.py
,并将过滤器命名为cstring
(
文件夹filter_plugins/
:中的myfilters.py
#!/usr/bin/python
class FilterModule(object):
def filters(self):
return {
'cstring': self.cstring
}
def cstring(self, data):
result = ""
for k in data:
result += (',' if result else '') + k + '=' + data[k].lower()
return result
战术手册:
- name: "tips1"
hosts: localhost
vars:
foo: {"A": "Aardvark", "B": "Beaver", "C": "Cat"}
tasks:
- name: debug users
set_fact:
result: "{{ foo | cstring }}"
- name: display result
debug:
var: result
结果:
ok: [localhost] => {
"result": "A=aardvark,B=beaver,C=cat"
}
使用自定义过滤器的优点是只需一个操作即可完成复杂的事情或大量操作。