がじぇ

お金と家電とプログラミングのブログ

jinja2で複数のリストをまとめてfor文で処理する

はじめに

jinja2を使う処理で結構はまったのでメモです

やりたかったこと

jinja2上で複数のリストをまとめてfor文で処理をしたかった。

以下例

A_list = [a_1, a_2, a_3]
B_list = [b_1, b_2, b_3]

上記リストをindexごとにまとめて出力したかった

1セット目
 a_1 b_1

2セット目
 a_2 b_2

3セット目
 a_3 b_3

これはpythonで実装するとzipやenumerateを使うと簡単にできます

A_list = [a_1, a_2, a_3]
B_list = [b_1, b_2, b_3]
for (x, y) in zip(A, B):   #list1,list2を同時にループ
   print(a,b)

出力結果

 a_1 b_1

 a_2 b_2

 a_3 b_3

上記のような複数リストを元にしたfor文をjinja2テンプレート上で書きたかったのですが、これがなかなか苦労しました。

結果から申し上げると以下のような形で実装できました

{% for x in A_list %}{% set A_list_loop = loop %}

{# loop.index で、インデックスを取得し、A_listとB_listのindexが同一の際はfor文で結果を出力する #}
{% for y in B_list %}{% if loop.index==A_list_loop.index %}
           A_list: {{ x }}
           B_list: {{ y }}
{% endif %}
{% endfor %}
{% endfor %}

出力結果

A_list: a_1
B_list: b_1

A_list: a_2
B_list: b_2

A_list: a_3
B_list: b_3

処理の説明

jinja2においてはloop.indexを用いることにより、loopのindex番号を取得することができます

これによりまずA_listのindexを取得します

そしてB_listをまわすときにA_listのindexと同一の場合、

           A_list: {{ x }}
           B_list: {{ y }}

を出力する、という形に書きます

上記により、複数リストを並列的に出力することができます

誰かのお役に立てましたら幸いです。 Jinjaはなかなか奥が深い