Jinja2中列表的唯一过滤器

时间:2017-06-02 12:59:00

标签: python-3.x jinja2

我有以下YAML结构:

['1', '2']

我试图使用Jinja2获得插槽的唯一列表,即:

{{ bri.cards|map(attribute='slot')|list }}

到目前为止,我已成功应用以下内容:

['1', '1', '1', '2', '2']

这给了我:

ssh gerrit gerrit review --label developer-verified=VALUE COMMIT|CHANGEID,PATCHSET

但是,我似乎无法找到获得唯一列表的方法。

Ansible

Ansible似乎有一个独特的"可以做到这一点的过滤器。但在这种情况下,我并没有使用Ansible。

我的问题

有人能建议实现这一目标的最佳方法吗?应该(或可以)使用Jinja2本地完成,还是应该采用替代方法?

3 个答案:

答案 0 :(得分:2)

你可以做这样的事情(取决于你如何解析.yaml文件 - 它是一个dicts的dicts列表吗?):

{% set slots = [] %}
{% for slot in bri.cards if slot not in slots %}
    {% do slots.append(slot) %}
{% endfor %}

答案 1 :(得分:2)

因为jinja2 2.10

unique版本中添加了2.10过滤器。您可以检查change logPR

用法示例

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>

答案 2 :(得分:1)

已编辑 - 我没有看到关于无法使用唯一过滤器的问题。 对于那些可以使用唯一过滤器的人,可以这样做

{{ bri.cards|map(attribute='slot')|unique|list }}