【问题标题】:How to use enumerate(zip(seq1,seq2)) in jinja2?如何在 jinja2 中使用 enumerate(zip(seq1,seq2))?
【发布时间】:2019-08-08 14:18:40
【问题描述】:

我正在尝试使用 Django 为一些 RNA 序列着色。我正在使用 enumerate 和 zip 在列表中查找等于索引。例如:

for i, (a, b) in enumerate(zip(seq1, seq2)):
        if a == b and i not in green:
            <p style="color: green;">{{i}}</p>

        elif a != b and i not in red:
            <p style="color: red;">{{i}}</p>

我在模板中收到此错误:

'for' 语句应该使用格式'for x in y':for i, (a, b) in 枚举(zip(seq1,seq2)):

【问题讨论】:

标签: python django jinja2 enumerate


【解决方案1】:

姜戈doesn't allow arbitrary code in for loop templates; you can't even loop over a simple range defined in the template。它基本上是在告诉你你只能做简单的 for 循环,从一个简单的输入迭代中每个循环读取一个项目。

解决方案是在呈现模板的代码中创建“要迭代的东西”,并将其作为上下文的一部分传入,然后对其进行迭代。

【讨论】:

  • 这不是 Django 模板引擎,它是 Django 中安装的 Jinja 模板引擎。
【解决方案2】:

我认为 Jinja 模板引擎在解析 for 循环中的 i, (a, b) 部分时有问题,所以也许值得为此提交一张票。也许这是预期的行为。

无论如何,您可以在此处使用 3 元组进行压缩。作为第一个可迭代的 zip,我们可以采用 itertools.count [python-doc]。因此,您将带有 itertools.count() 的引用 'count' 传递给上下文,然后使用以下内容进行渲染:

{% for i, a, b in zip(indices(), seq1, seq2) %}
     {# ... #}
{% endfor %}

例如:

>>> from jinja2 import Template
>>> from itertools import count
>>> Template('{% for i, a, b in zip(indices(), seq1, seq2) %} {{ (i, a, b) }}{% endfor %}').render(indices=count, seq1='foobar', seq2='babbaa', zip=zip)
" (0, 'f', 'b') (1, 'o', 'a') (2, 'o', 'b') (3, 'b', 'b') (4, 'a', 'a') (5, 'r', 'a')"

话虽如此,我强烈建议不要在模板中编写业务逻辑。事实上,这是 Django 模板引擎一开始就不允许这种语法的主要原因。在视图中创建zip 对象并通过上下文将其传递给渲染引擎可能会更好。

【讨论】:

    【解决方案3】:

    这段代码可能会有所帮助,试试下面链接的代码,它对我来说很好

    (根据我使用的一些工作代码修改)

    在 Jinja2 中使用 'for loop' 时,使用 loop.xxx 来访问一些特殊的变量

    such as:
      loop.index        # index (1 inexed)
      loop.index0       # index (0 inexed)
      loop.revindex     # reversed ...
      loop.revindex0    # reversed ...
      loop.first        # True if first iteration
      loop.last         # True if last iteration
      loop.length
      loop.depth        # Recursive loop depth
      loop.depth0       # Recursive loop depth (0 inexed)
    

    代码:

    {% for (item_a, item_b) in zip(seq1, seq2) %}
    {# important note: you may need to export __builtin__.zip to Jinja2 template engine first! I'm using htmlPy for my app GUI, I'm not sure it will or not affect the Jinja2 Enviroment, so you may need this #}
      <tr>
        <td>No.{{ loop.index0 }}</td>{# index (0 inexed) #}
        <td>No.{{ loop.index }}</td>{# index (1 started) #}
        <td>{{item_a}}</td>
        <td>{{item_b}}</td>
      </tr>
    {% endfor %}
    

    我的环境:

    python 2.7.11 (I have py35 py36 but the code wasn't tested with them)
    
    >py -2
    Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:53:40) [MSC v.1500 64 bit (AMD64)] on win32
    >pip2 show jinja2
    Name: Jinja2
    Version: 2.8
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-23
      • 2018-10-27
      • 1970-01-01
      • 2022-10-04
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      • 2019-03-28
      相关资源
      最近更新 更多