Jinja-Schleife verschachtelte Liste erstellt eine leere Ausgabe
Habe ich die af-Liste von dieser Struktur übergeben die Vorlage mit dem Namen bars
in Python 3.4:
[{'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'}]
Ich will, dass es die folgende Ausgabe für jedes Wörterbuch:
% 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
Die ersten beiden sind kein problem, aber ich kann Sie nicht zum Durchlaufen der Liste vorkommen. Ich verwende die folgenden jinja template:
{% 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 %}
Dieser gibt diese komische Ausgabe im Dritten Fall:
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
Dass ist merkwürdig, da es scheint, dass es eine Schleife jedes Element der Liste mit vorkommen, aber es hat die Prüfung nicht bestanden für den Inhalt. Was mache ich falsch?
Edit: Alle drei Antworten wies mich in die richtige Richtung, aber @famousgarkin geben, die die aufwendige und flexible Antwort. Ich landete mit der folgenden Lösung:
{% for item in bars %}
Item {{ loop.index }}: {% for occurrence in item.occurrences %} subitem {{ loop.index }}: {{ occurrence }} {% endfor %}
{% endfor %}
Dies ermöglicht es mir, schließen Sie jedes Element in separaten Kontext, das ist, was ich will. Aber da wurde dieses Ziel nicht von Anfang an klar, ich wünschte, ich könnte upvote alle Ihre Antworten. Sorry, aber danke Euch allen für die schnelle Hilfe!!!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nicht möchten, formatieren Sie die geschachtelten Elemente mit genau der gleichen Logik, die Sie nicht verwenden die Rekursion.
In deinem Beispiel, wenn man looping
bars
Elemente, es geht um den richtigen Weg, da kann man sehenItem n:
auf die Ausgabe. Dann geht es hinunter zu einem rekursiven Aufruf Prozessitem.occurrences
Elemente. Nun, wenn es fragt, oboccurrences
existiert, es ist tatsächlich zu Fragen fürbar.occurrences[i].occurrences[j]
, was natürlich nicht dieoccurrences
Attribut und es geht dieNo content
Weg. Sie können ihn in Aktion zu sehen mit den folgenden:Ergibt:
Dann funktioniert es, wie zum Beispiel:
Ergibt:
Wenn Sie wollen, um die Iteration über die Elemente, die sich um Ihre eigene Formatierung, können Sie zum Beispiel verwenden die Jinja
join
filter:Ergibt:
Oder loop wieder zu Rollen vollständig benutzerdefinierte Formatierung:
Ergibt:
Drucken Sie einfach aus der Liste.
Wenn
bars
immeroccurrences
Sie müssen nicht einmal dieif
überprüfen.Drucken Individuum Elemente aus vorkommen, nur Durchlaufen Sie,
Wenn Sie gehen, um drucken Sie die gesamte Liste sowieso, Sie können nur einen filter verwenden, zurückgibt, str Darstellung der Liste, ohne die eckigen Klammern.
occurrences
ist eine Liste, Sie können einfach Durchlaufen es immer wieder, siehe mein edit.Hier funktionierenden code.
join
zu erstellen, die Liste der vorkommenrecursive
Schleife über Vorkommnisse (wie die Daten, die sind flach und nicht verschachtelt)Dieses Skript ausführen:
Du bekommst diese Ausgabe: