结合两个列表并在Jinja中交替结果?

时间:2017-12-11 20:50:57

标签: jinja2

我正在使用沙盒CMS,因此除了Jinja版本之外,我无法运行任何pythonic代码。

我从数据库中提取我的列表,我根据字段=某个值来分割它们。

{# rows = command to pull from db #}

{% set row_one = rows|selectattr('resource','equalto','One') %}
{% set row_two = rows|selectattr('resource','equalto','Two') %}
{# Sets my empty array #}
{% set newobj = [] %}

从这里开始,第一行/第二行的控制台记录将只显示那些适用于各自资源类型的项目。

当我尝试将这两个填充到数组中然后迭代它以交替结果时,我的问题出现了。

以下是我的尝试:

{% for row in rows %}
   {% newObj.update(row_one[loop.index0], row_two[loop.index0] %}
{% endfor %}

这似乎在newObj

上引发了错误
  

未知标记' newobj'

我让它停止使用:

抛出错误
{% for row in rows %}
  {% set objs = newObj.update(marketingRows[loop.index0], salesRows[loop.index0], designRows[loop.index0]) %}
{% endfor %}

但事实证明,当控制台记录objs时,这并没有返回任何内容。

我想要的结果

{# example input #}
row_one = ['1', '2', '3', '4']
row_two = ['a', 'b', 'c', 'd']

{# desired output #}
objs =  ['1', 'a', '2', 'b', '3', 'c', '4', 'd']

我完全失去了这里,感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

从个人经验来看,由于你无法运行任何python代码,因此没有 easy 方法在jinja中实现这一点。由于jinja不支持zipmaxv2.10之前无法使用,因此我们需要即兴创作。

首先,您需要获得任一列表的最长长度。

{%- set row_one = ['1', '2', '3', '4'] -%}
{%- set row_two = ['a', 'b', 'c', 'd'] -%}
{%- set rows_combined = (row_one, row_two) -%}

{%- set lengths = [] %}
{%- for row in rows_combined -%}{%- if lengths.append(row|length)-%}{%- endif -%}{%- endfor -%}
{%- set max_length = (lengths|sort)[-1] -%}

接下来,您需要执行嵌套循环。首先迭代最大长度范围,然后rows_combined以获取row_onerow_two的正确索引。

{%- set rows = [] -%}    

{# Loops through a range of max_length #}
{%- for r in range(max_length) -%}
    {# Loops through the tuple containing row_one and row_two #}
    {%- for a in rows_combined -%}
        {# checks if a[r] exists if based on current index, if so appends it rows#}
        {%- if a[r] -%}{%- if rows.append(a[r]) -%}{%- endif -%}{%- endif -%}
    {%- endfor -%}
{%- endfor -%}

{{ rows }}

>>>['1', 'a', '2', 'b', '3', 'c', '4', 'd']

使用3个列表而不是2个

进行测试
{%- set row_one = ['1', '2', '3', '4'] -%}
{%- set row_two = ['a', 'b', 'c', 'd'] -%}
{%- set row_three = ['w', 'x', 'y', 'z'] -%}
{%- set rows_combined = (row_one, row_two, row_three) -%}

{%- set lengths = [] %}
{%- for row in rows_combined -%}{%- if lengths.append(row|length)-%}{%- endif -%}{%- endfor -%}
{%- set max_length = (lengths|sort)[-1] -%}
{%- set rows = [] -%}

{%- for r in range(max_length) -%}
    {%- for a in rows_combined -%}
        {%- if a[r] -%}{%- if rows.append(a[r]) -%}{%- endif -%}{%- endif -%}
    {%- endfor -%}
{%- endfor -%}
{{ rows }}

>>> ['1', 'a', 'w', '2', 'b', 'x', '3', 'c', 'y', '4', 'd', 'z']