Jinja2:将一个列表中的项目与另一个列表中的项目进行比较

时间:2017-11-07 21:29:52

标签: python list compare jinja2 items

我有一个主题列表:

list1 = [topic1, topic2, topic3, topic4, topic5, topic6]

我想针对此列表检查另一个列表:

list2 = [topic2, topic4, topic6]

类似的东西:

{% if list2.items in list1 %}

其中list2中的每个项目都在list1中检查。如果list2中的所有或任何项目都在列表1中,那么它是真的。我认为这很简单,但我无法找到任何有用的东西。

完整示例:

{% set list1 = [topic2, topic4, topic6] %}

{% for post in posts %}

   {% set list2 = [topic1, topic2, topic3, topic4, topic5, topic6] %}

   {% for topic in list2 %}
       {% if topic in list1 %}

          {# output of post list based on conditions #}

       {% endif %}
   {% endfor %}
{% endfor %}

**我正在使用服务器端访问的cms,因此我只能使用模板语言。

2 个答案:

答案 0 :(得分:1)

我不知道任何Jinja2 built-in tests可以做到这一点,但很容易添加自己的。{/ p>

假设您在名为template.j2的文件中有这样的模板:

Is l1 in l2: {% if l1 is subsetof(l2) %}yes{% else %}no{% endif %}

然后,您可以(在此示例的同一目录中)使用添加此检查的Python脚本:

import jinja2


def subsetof(s1, s2):
    return set(s1).issubset(set(s2))


loader = jinja2.FileSystemLoader(".")
env = jinja2.Environment(loader=loader)
env.tests["subsetof"] = subsetof

template = env.get_template("template.j2")
print(template.render(l1=[1, 2], l2=[1, 2, 3]))

请注意,test函数的第一个参数在模板中的is子句之前传递,而第二个参数在括号内传递。

这应该打印:

Is l1 in l2: yes

了解如何定义自定义测试here

答案 1 :(得分:1)

只需创建自定义过滤器:

def intersect(a, b):
    return set(a).intersection(b)

env.filters['intersect'] = intersect

然后将其用作任何其他过滤器:

    {% if list1 | intersect(list2) %}
        hello
    {% else %}
        world
    {% endif%} 

这就是Ansible中完成的方式。