我有一个传递给Python 3.4中名为bars
的模板的结构列表:
[{'var': 1.18, 'occurrences': [0.0805, 0.0808, 0.0991, 0.0994, 0.2356], 'name': 'item name'},
{'var': 2.31, 'occurrences': [1.0859, 1.1121, 1.4826, 1.4829, 1.8126, 1.8791], 'name': 'other name'}]
我希望它为每个字典创建以下输出:
% List with names
item 1: item name
item 2: other name
% List with vars
item 1: 1.18
item 2: 2.31
% List with occurences
item 1: 0.0805, 0.0808, 0.0991, 0.0994, 0.2356
item 2: 1.0859, 1.1121, 1.4826, 1.4829, 1.8126, 1.8791
前两个没问题,但我无法让它循环出现列表。我使用以下jinja模板:
{% for item in bars %}
item {{ loop.index }}: {{ item.name }}
{% endfor %}
{% for item in bars %}
item {{ loop.index }}: {{ item.var }}
{% endfor %}
{% for item in bars recursive %}
{% if item.occurrences %}
Item {{ loop.index}}: {{ loop(item.occurrences) }}
{% else %}
No content
{% endif %}
{% endfor %}
这在第三种情况下给出了这个奇数输出:
Item 1: No content
No content
No content
No content
No content
Item 2: No content
No content
No content
No content
No content
No content
这很奇怪,因为它似乎循环列表中的每个项目,但它没有通过内容测试。我做错了什么?
编辑:所有三个答案都指向了正确的方向,但@famousgarkin给出了最精细和灵活的答案。我最终得到了以下解决方案:
{% for item in bars %}
Item {{ loop.index }}: {% for occurrence in item.occurrences %} subitem {{ loop.index }}: {{ occurrence }} {% endfor %}
{% endfor %}
这让我可以将每个项目放在单独的上下文中,这就是我想要的。但由于这个目标从一开始就不明确,我希望我可以提出你所有的答案。对不起,谢谢大家的快速帮助!
答案 0 :(得分:3)
如果您不想使用完全相同的逻辑格式化嵌套项目,则不要使用递归。
在您的示例中,当循环bars
项时,它会转到正确的路径,因为您可以在输出中看到Item n:
。然后它下降到递归调用以处理item.occurrences
项。现在,当它询问occurrences
是否存在时,它实际上要求bar.occurrences[i].occurrences[j]
,当然它没有occurrences
属性,而是No content
路径。您可以使用以下方法查看它:
{% for item in bars recursive %}
{% if item.occurrences %}
Item {{ loop.index }}: {{ loop(item.occurrences) }}
{% else %}
No content, {{ item.__class__ }}, {{ item }}
{% endif %}
{% endfor %}
收率:
Item 1: No content, <type 'float'>, 0.0805
No content, <type 'float'>, 0.0808
No content, <type 'float'>, 0.0991
No content, <type 'float'>, 0.0994
No content, <type 'float'>, 0.2356
...
它会像这样工作,例如:
{% for item in bars %}
{% if item.occurrences %}
Item {{ loop.index }}: {{ item.occurrences }}
{% else %}
No content
{% endif %}
{% endfor %}
收率:
Item 1: [0.0805, 0.0808, 0.0991, 0.0994, 0.2356]
Item 2: [1.0859, 1.1121, 1.4826, 1.4829, 1.8126, 1.8791]
如果您想自己迭代这些项目以提供自己的格式,您可以使用Jinja join
过滤器:
{% for item in bars %}
{% if item.occurrences %}
Item {{ loop.index }}: {{ item.occurrences|join(', ') }}
{% else %}
No content
{% endif %}
{% endfor %}
收率:
Item 1: 0.0805, 0.0808, 0.0991, 0.0994, 0.2356
Item 2: 1.0859, 1.1121, 1.4826, 1.4829, 1.8126, 1.8791
或者再循环以完全滚动自定义格式:
{% for item in bars %}
{% if item.occurrences %}
Item {{ loop.index }}:
{% for occurrence in item.occurrences %}
{{ loop.index }}. {{ occurrence }}
{% endfor %}
{% else %}
No content
{% endif %}
{% endfor %}
收率:
Item 1:
1. 0.0805
2. 0.0808
3. 0.0991
4. 0.0994
5. 0.2356
...
答案 1 :(得分:0)
只需打印清单。
{% for item in bars %} #recursive not needed
{% if item.occurrences %}
Item {{ loop.index }}: {{ item.occurrences }} #we're not looping here, just printing out the list
{% endif %}
{% endfor %}
如果bars
始终有occurrences
,您甚至不需要if
检查。
要从事件中打印单个项目,只需迭代它,
Item {{ loop.index}}: {% for occurrence in occurrences %}
{{ occurrence }}{% if not loop.last %}, {% endif %}
{% endfor %}
如果你打算打印出整个列表,你可以使用一个过滤器,它返回列表的str表示,不带方括号。
答案 2 :(得分:0)
这是工作代码。
join
创建出现列表recursive
(因为数据是扁平的而不是嵌套的)运行此脚本:
from jinja2 import Template
bars = [{'var': 1.18, 'occurrences': [0.0805, 0.0808, 0.0991, 0.0994, 0.2356], 'name': 'item name'},
{'var': 2.31, 'occurrences': [1.0859, 1.1121, 1.4826, 1.4829, 1.8126, 1.8791], 'name': 'other name'}]
templ_str = """
% List with names
{% for item in bars -%}
item {{ loop.index }}: {{ item.name }}
{% endfor %}
% List with vars
{% for item in bars -%}
item {{ loop.index }}: {{ item.var }}
{% endfor %}
% List with occurrences
{%- for item in bars %}
item {{ loop.index}}:{{" "}}
{%- if item.occurrences -%}
{{ item.occurrences|join(", ") }}
{%- else -%}
No content
{%- endif -%}
{%- endfor -%}
"""
templ = Template(templ_str)
print templ.render(bars=bars)
你应该得到这个输出:
% List with names
item 1: item name
item 2: other name
% List with vars
item 1: 1.18
item 2: 2.31
% List with occurrences
item 1: 0.0805, 0.0808, 0.0991, 0.0994, 0.2356
item 2: 1.0859, 1.1121, 1.4826, 1.4829, 1.8126, 1.8791