我有一个主题列表:
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
在此处查看如何定义自定义测试