如何在 jinja2 中使用 enumerate(zip(seq1,seq2))?
How to use enumerate(zip(seq1,seq2)) in jinja2?
我正在尝试使用 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' statements should use the format 'for x in y': for i, (a, b) in
enumerate(zip(seq1, seq2)):
Django doesn't allow arbitrary code in for loop templates; you can't even loop over a simple range
defined in the template。它基本上是在告诉您,您只能执行简单的 for 循环,每个循环从一个简单的输入 iterable 中读取一个项目。
解决方案是在呈现模板的代码中创建 "thing to iterate over",并将其作为上下文的一部分传入,然后对其进行迭代。
我认为 Jinja 模板引擎在解析 for
循环中的 i, (a, b)
部分时有问题,所以也许值得提交一张票这个。也许这是有意为之的行为。
无论如何,你可以在这里用一个三元组压缩。作为压缩的第一个迭代器,我们可以采用 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
对象并通过上下文将其传递给渲染引擎可能会好得多。
此代码可能会有所帮助,试试下面的代码链接,它对我来说工作正常
(根据我使用的一些工作代码修改)
在 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
我正在尝试使用 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' statements should use the format 'for x in y': for i, (a, b) in enumerate(zip(seq1, seq2)):
Django doesn't allow arbitrary code in for loop templates; you can't even loop over a simple range
defined in the template。它基本上是在告诉您,您只能执行简单的 for 循环,每个循环从一个简单的输入 iterable 中读取一个项目。
解决方案是在呈现模板的代码中创建 "thing to iterate over",并将其作为上下文的一部分传入,然后对其进行迭代。
我认为 Jinja 模板引擎在解析 for
循环中的 i, (a, b)
部分时有问题,所以也许值得提交一张票这个。也许这是有意为之的行为。
无论如何,你可以在这里用一个三元组压缩。作为压缩的第一个迭代器,我们可以采用 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
对象并通过上下文将其传递给渲染引擎可能会好得多。
此代码可能会有所帮助,试试下面的代码链接,它对我来说工作正常
(根据我使用的一些工作代码修改)
在 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