【问题标题】:Jinja2: Compare items in one list to items in another listJinja2:将一个列表中的项目与另一个列表中的项目进行比较
【发布时间】:2017-11-07 21:29:51
【问题描述】:

我有一个主题列表:

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

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

list2 = [topic2, topic4, topic6]

类似这样的:

{% if list2.items in list1 %}

在 list1 中检查 list2 中的每个项目。如果 list2 中的所有或任何项目都在列表 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 中工作,所以我只有模板语言可以使用。

【问题讨论】:

  • 您可以使用列表理解:[item for item in list1 if item in list2]

标签: python list compare jinja2 items


【解决方案1】:

只需创建一个自定义过滤器:

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

env.filters['intersect'] = intersect

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

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

Ansible 是这样处理的。

【讨论】:

    【解决方案2】:

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

    假设您在名为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]))
    

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

    这应该打印出来:

    Is l1 in l2: yes
    

    看看如何定义自定义测试here

    【讨论】:

    • 很好的解决方案!我使用的 cms 只为我提供了一种模板语言,因此我无法使用 python 脚本。
    • 啊,在那种情况下,我不确定您是否可以使用自定义 Jinja2 过滤器。您可能需要在模板中手动迭代这些项目。但这看起来不太好,模板逻辑也只能到此为止。
    猜你喜欢
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    相关资源
    最近更新 更多