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



我有一个主题列表:

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

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

list2 = [topic2, topic4, topic6]

像这样:

{% if list2.items in list1 %}
其中,列表 2 中的每个项目都在列表 1 中

选中。如果列表 2 中的所有或任何项目都在列表 1 中,则为 True。我认为这很简单,但我找不到任何有用的东西。

完整示例:

{% 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 中工作,所以我只有模板语言可以使用。

只需创建自定义过滤器:

def intersect(a, b):
    return set(a).intersection(b)
env.filters['intersect'] = intersect

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

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

这就是它在 Ansible 中完成的方式。

我不知道

有任何 Jinja2 内置测试可以做到这一点,但添加自己的测试很容易。

假设您在一个名为 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

在此处查看如何定义自定义测试

相关内容

  • 没有找到相关文章

最新更新