/ / Combinar duas listas e alternar o resultado em Jinja? - jinja2

Combine duas listas e alterne o resultado em Jinja? - jinja2

Estou trabalhando em um CMS em área restrita para que não possa executar nenhum código pythônico, exceto as versões do Jinja.

Estou retirando minhas listas de um banco de dados onde as divido com base no fato de ter um campo = um determinado valor.

{# 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 = [] %}

A partir daqui, o registro do console na linha um / dois resultará em me mostrar apenas os itens que se aplicam aos seus respectivos tipos de recursos.

Meu problema surge quando tento colocar esses dois em uma matriz e, em seguida, iterar sobre ele para alternar o resultado.

Aqui está o que eu tentei:

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

Isso parece estar gerando um erro no newObj

Tag desconhecida "newobj"

Eu fiz com que ele parasse de lançar o erro usando:

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

Mas isso provou não retornar nada durante o registro do console 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"]

Estou totalmente perdido aqui, qualquer ajuda é apreciada!

Respostas:

0 para resposta № 1

Por experiência pessoal, e uma vez que você não é capaz de executar nenhum código Python, não há fácil maneira de fazer isso no jinja. Uma vez que jinja não suporta zipe max não está disponível até v2.10, então precisamos improvisar.

Primeiro, você precisa obter o maior comprimento de cada lista.

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

Em seguida, você precisa fazer um loop aninhado. Primeiro iterando pelo intervalo do comprimento máximo e, em seguida, rows_combined para pegar o índice correto de row_one e row_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"]

Testes com 3 listas em vez de 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"]