Python Jinja2的zip(列表1、列表2)?

Python Jinja2的zip(列表1、列表2)?,python,code-generation,jinja2,Python,Code Generation,Jinja2,我在Jinja2中进行代码生成,我经常想一起迭代两个列表(即变量名称和类型),有没有简单的方法来实现这一点,还是只需要传递一个预压缩的列表?我在或Google中找不到这样的函数。我认为模板语言不允许在for循环中对两个容器进行压缩。这里有一个类似的问题,jinja模板非常接近django 您将预先构建压缩容器并传递到模板 >> for i,j in zip(range(10),range(20,30)): ... print i,j ... 相当于 >>>

我在Jinja2中进行代码生成,我经常想一起迭代两个列表(即变量名称和类型),有没有简单的方法来实现这一点,还是只需要传递一个预压缩的列表?我在或Google中找不到这样的函数。

我认为模板语言不允许在for循环中对两个容器进行压缩。这里有一个类似的问题,jinja模板非常接近django

您将预先构建压缩容器并传递到模板

>> for i,j in zip(range(10),range(20,30)):
...     print i,j
... 
相当于

>>> [(i,j) for i,j in zip(range(10),range(20,30))]

如果您认为合适,请修改jinja2.Environment本身

import jinja2
env = jinja2.Environment()
env.globals.update(zip=zip)
# use env to load template(s)

这可能有助于将视图(模板)逻辑与应用程序逻辑分离,但也可以实现相反的功能#

既然你没有提到你是否在使用烧瓶,我想我应该补充一下我的发现

要由
render_template()
使用Flask使用的Jinja2环境中的
zip()
函数创建“zip”过滤器

app = Flask(__name__)
...
app.jinja_env.filters['zip'] = zip
要在模板中使用此选项,请执行以下操作:

{% for value1, value2 in iterable1|zip(iterable2) %}
    {{ value1 }} is paired with {{ value2 }}
{% endfor %}
请记住,弦是很容易拉近的,所以如果你试图拉近弦,你会得到一些疯狂的东西。要确保要压缩的内容是可编辑的而不是字符串,请执行以下操作:

{%  if iterable1 is iterable and iterable1 is not string 
   and iterable2 is iterable and iterable2 is not string %}
    {% for value1, value2 in iterable1|zip(iterable2) %}
        {{ value1 }} is paired with {{ value2 }}
    {% endfor %}
{% else %}
  {{ iterable1 }} is paired with {{ iterable2 }}
{% endif %}

对于Flask,您可以在
render\u template()


好吧,我也这么怀疑。FWIW,我通过将我的列表合并到一个新类的列表中解决了这个问题,这可能更优雅。对于Flask应用程序:
app.jinja\u env.globals.update(zip=zip)
对于金字塔应用程序,使用
env=config.get\u jinja2\u environment()
。然后继续如上所述。有关如何在应用程序配置中正确使用该方法的详细信息,请参阅。将配置添加到flask appI中非常有用的答案我从@Chris Farr comment中获得了解决方案
  return render_template("home.html", zip=zip)