首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Jinja2中压缩(list1,list2)?

在Jinja2中压缩(list1,list2)?
EN

Stack Overflow用户
提问于 2011-03-06 10:31:06
回答 4查看 19.4K关注 0票数 47

我正在用Jinja2做代码生成,我经常想一起迭代两个列表(即变量名称和类型),有没有简单的方法可以做到这一点,或者我只需要传递一个预压缩的列表?我在docs或谷歌搜索中找不到这样的功能。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-08 02:51:56

如果您认为合适,请修改jinsa2.Environment global namespace本身。

代码语言:javascript
复制
import jinja2
env = jinja2.Environment()
env.globals.update(zip=zip)
# use env to load template(s)

这可能有助于将视图(模板)逻辑从应用程序逻辑中分离出来,但也可以实现相反的效果。#separationofconcerns

票数 54
EN

Stack Overflow用户

发布于 2017-09-30 03:04:29

既然你没有提到你是否在使用Flask,我想我应该加上我的发现。

要由render_template()使用,请在Flask使用的Jinja2环境中使用zip()函数创建'zip‘过滤器。

代码语言:javascript
复制
app = Flask(__name__)
...
app.jinja_env.filters['zip'] = zip

要在模板中使用它,请执行以下操作:

代码语言:javascript
复制
{% for value1, value2 in iterable1|zip(iterable2) %}
    {{ value1 }} is paired with {{ value2 }}
{% endfor %}

记住,字符串是可迭代的Jinja2,所以如果你试图压缩成字符串,你会得到一些疯狂的东西。要确保您要压缩的内容是可迭代的,而不是字符串,请执行以下操作:

代码语言:javascript
复制
{%  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 %}
票数 22
EN

Stack Overflow用户

发布于 2011-03-06 10:42:03

我不认为模板语言允许在for循环上压缩两个容器。这是一个类似的问题,django和jinja模板非常接近django的。

您需要预先构建压缩容器,并将其传递给模板。

代码语言:javascript
复制
>> for i,j in zip(range(10),range(20,30)):
...     print i,j
... 

等同于

代码语言:javascript
复制
>>> [(i,j) for i,j in zip(range(10),range(20,30))]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5208252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档