zip (list1, list2) в Jinja2?

Я делаю генерацию кода в Jinja2, и я часто хочу итерации по двум спискам вместе (т. Е. Имена переменных и типы), есть ли простой способ сделать это или мне нужно просто передать список с предварительным сжатием? Я не смог найти такую ​​функцию в документах или в googling.

Измените глобальное пространство имен jinja2.Environment, если вы считаете нужным.

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

Это может быть полезно для разделения логики представления (шаблона) из логики приложения, но также позволяет обратное. # divisionofconcerns

Я не думаю, что шаблоны языков позволяют делать zip из двух контейнеров для цикла. Вот аналогичный вопрос для django и jinja templating очень близок к django's.

Вы бы предварительно создали zipped контейнер и перейти к шаблону.

 >> 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))] 

Поскольку вы не упомянули, используете ли вы Flask или нет, я решил, что добавлю свои выводы.

Чтобы использовать render_template() создайте фильтр «zip», используя функцию zip() в среде Jinja2, используемой Flask.

 app = Flask(__name__) ... app.jinja_env.filters['zip'] = zip 

Чтобы использовать это в шаблоне, сделайте следующее:

 {% for value1, value2 in iterable1|zip(iterable2) %} {{ value1 }} is paired with {{ value2 }} {% endfor %} 

Имейте в виду, что строки являются итерабельными Jinja2, поэтому, если вы попытаетесь застегнуть строки, вы получите некоторые сумасшедшие вещи. Чтобы убедиться, что вы хотите сделать zip, итерабельно, а не строку, выполните следующие действия:

 {% 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 %}