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"
      subslot: "1"
      ports: 2

我正在尝试使用 Jinja2 获取唯一的 插槽 列表,即:

 ['1', '2']

到目前为止,我已经设法应用了以下内容:

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

这给了我:

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

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

Ansible的

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

我的问题

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

原文由 jonathan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 559
2 个回答

自 jinja2 2.10

在版本中添加了 unique 过滤器 2.10 (2017-11-08 发布)。您可以检查 更改日志PR

使用示例

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>

原文由 Edgar Ramírez Mondragón 发布,翻译遵循 CC BY-SA 4.0 许可协议

编辑- 我没有看到有关无法使用唯一过滤器的信息。对于那些可以使用 独特过滤器 的人,您可以这样做

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

原文由 Mz A 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进