Python 3.x Jinja2中列表的唯一筛选器

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

我有以下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

我的问题
有人能提出实现这一目标的最佳方法吗?这应该(或可以)通过Jinja2本机实现,还是我应该采用另一种方法?

您可以这样做(取决于您如何解析
.yaml
文件-它是一个dict的列表?)


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

{{ bri.cards|map(attribute='slot')|unique|list }}
自jinja2
2.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>