Python 3.x Jinja2中列表的唯一筛选器
我有以下YAML结构:Python 3.x Jinja2中列表的唯一筛选器,python-3.x,jinja2,Python 3.x,Jinja2,我有以下YAML结构: bri: cards: - slot: "1" subslot: "0" ports: 2 - slot: "1" subslot: "1" ports: 2 - slot: "1" subslot: "2" ports: 2 - slot: "2" subslot: "0" ports: 2 - slot: "2" su
bri:
cards:
- slot: "1"
subslot: "0"
ports: 2
- slot: "1"
subslot: "1"
ports: 2
- slot: "1"
subslot: "2"
ports: 2
- slot: "2"
subslot: "0"
ports: 2
- slot: "2"
subslot: "1"
ports: 2
我正在尝试使用Jinja2获取唯一的插槽列表,即:
['1', '2']
到目前为止,我已成功应用了以下内容:
{{ bri.cards|map(attribute='slot')|list }}
这给了我:
['1', '1', '1', '2', '2']
然而,我似乎无法找到一种方法来获得唯一的列表
安西布尔
Ansible似乎有一个“独特”的过滤器可以做到这一点。但在这种情况下我不使用Ansible
有人能提出实现这一目标的最佳方法吗?这应该(或可以)通过Jinja2本机实现,还是我应该采用另一种方法?您可以这样做(取决于您如何解析
.yaml
文件-它是一个dict的列表?)
已编辑-我没有看到关于无法使用唯一过滤器的内容。 对于那些可以使用唯一过滤器的用户,您可以这样做
{{ bri.cards|map(attribute='slot')|unique|list }}
自jinja22.10以来
在版本2.10
中添加了一个unique
过滤器。您可以检查和
用法示例
来自jinja2导入模板的
模板=模板(“”)
|unique%}
{{x}
{%endfor%}
""")
r=template.render(a=[1,2,3,4,1,5,4])
印刷品(r)
输出:
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
1
二,
三,
四,
五,
谢谢,这是我能找到的最好的了。除此之外,我认为我应该利用Ansible或将一些繁重的工作移出模板引擎。遗憾的是,本机没有用于此的过滤器。我可能会提出一个功能请求,不管它值多少钱。在处理列表中的复杂元素(即dict)而不是简单类型时,这是一个很好的解决方案
from jinja2 import Template
template = Template("""
{% for x in a|unique %}
<li>{{ x }}</li>
{% endfor %}
""")
r = template.render(a=[1, 2, 3, 4, 1, 5, 4])
print(r)
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>