Ich lerne immer noch jinja2 und flask und habe Schwierigkeiten, dictsort in jinja2 zu verwenden.

Also übergebe ich dieses Diktat in eine jinja2-Vorlage:

{'PEDD United': {'id': 37828, 'rank': 12, 'totalpts': 307},'Fc Mbonabushia': {'id': 205633, 'rank': 6, 'totalpts': 356},'FC Slurp': {'id': 933573, 'rank': 11, 'totalpts': 312},'KFC_Overijse': {'id': 38861, 'rank': 5, 'totalpts': 362},'Fc Paris': {'id': 1538051, 'rank': 2, 'totalpts': 396}}

Ich möchte eine Tabelle erstellen, die nach dem Wert des Schlüssels 'totalpts' sortiert ist. Ich habe alle möglichen Dinge ausprobiert und es werden beim "Sortieren" einfach keine Totalpten berücksichtigt.

Hier ist einer meiner Codes:

        <table class="table table-bordered">
        {% for team in league %}
            <tr>
                <td>{{team}}</td>
                {% for data in league[team]|dictsort(league[team]['totalpts']) %}
                <td>{{ league[team]['totalpts'] }}</td>
                {% endfor %}
            </tr>
        {% endfor %}
    </table>

Dadurch sortiert es in diesem Fall nichts ... Drucken Sie einfach den Wert in der Tabelle ohne Reihenfolge ...

Kann mir jemand helfen?

Vielen Dank

18
Syl 7 Okt. 2012 im 13:16

3 Antworten

Beste Antwort

Die Art und Weise, wie Sie dies tun, funktioniert nicht, da Sie, sobald Sie {% for team in league %} verwenden, bereits das unsortierte Diktat verwenden und das Schlüssel-Wert-Paar daraus extrahieren.

Ich denke, |dictsort kann Ihnen in diesem Fall möglicherweise nicht weiterhelfen, da Sie weder nach Schlüssel noch nach Wert sortieren können, sondern nach dem Wert des Werts (Unterdikts) für 'Totalpts'.

Stattdessen sollten Sie dieses Wörterbuch sortieren, bevor Sie es wie folgt an die Vorlage übergeben:

>>> from collections import OrderedDict
>>> league={'PEDD United': {'id': 37828, 'rank': 12, 'totalpts': 307},'Fc Mbonabushia': {'id': 205633, 'rank': 6, 'totalpts': 356},'FC Slurp': {'id': 933573, 'rank': 11, 'totalpts': 312},'KFC_Overijse': {'id': 38861, 'rank': 5, 'totalpts': 362},'Fc Paris': {'id': 1538051, 'rank': 2, 'totalpts': 396}}
>>> league = OrderedDict(sorted(league.items(), key= lambda x: x[1]['totalpts'], reverse=True))
>>> print league
OrderedDict([('Fc Paris', {'id': 1538051, 'rank': 2, 'totalpts': 396}), ('KFC_Overijse', {'id': 38861, 'rank': 5, 'totalpts': 362}), ('Fc Mbonabushia', {'id': 205633, 'rank': 6, 'totalpts': 356}), ('FC Slurp', {'id': 933573, 'rank': 11, 'totalpts': 312}), ('PEDD United', {'id': 37828, 'rank': 12, 'totalpts': 307})])

Um das Diktat zu sortieren, konvertieren wir es mit .items() in eine Liste von Tupeln von (Schlüssel, Wert). Angenommen, x ist ein solches Tupel, enthält x [1] das Wörterbuch mit dem Schlüssel 'totalpts'.

>>> league.items()[0]
('Fc Paris', {'id': 1538051, 'rank': 2, 'totalpts': 396})  # = x

Jetzt sortieren wir die Tupel mit x[1]['totalpts'] und reverse=True in absteigender Reihenfolge.

Ein Diktat selbst kann nicht sortiert werden, es ist ein ungeordneter Datentyp. Sie können entweder ein OrderedDict oder einfach Tupel verwenden:

>>> sorted(league.items(), key= lambda x: x[1]['totalpts'], reverse=True)
[('Fc Paris', {'id': 1538051, 'rank': 2, 'totalpts': 396}), ('KFC_Overijse', {'id': 38861, 'rank': 5, 'totalpts': 362}), ('Fc Mbonabushia', {'id': 205633, 'rank': 6, 'totalpts': 356}), ('FC Slurp', {'id': 933573, 'rank': 11, 'totalpts': 312}), ('PEDD United', {'id': 37828, 'rank': 12, 'totalpts': 307})]
18
Anuj Gupta 7 Okt. 2012 im 12:22

Sie können die Elemente eines Diktats mit dem normalen sort filtern.

Verwenden Sie zum Sortieren nach Schlüssel attribute=0:

{% for key, value in data.items()|sort(attribute='0') %}
  {{ key }}: {{ value }}
{% endfor %}

Verwenden Sie zum Sortieren nach Wert attribute=1

{% for key, value in data.items()|sort(attribute='1') %}
  {{ key }}: {{ value }}
{% endfor %}

Verwenden Sie attribute=1.name, um nach einem Attribut der Werte zu sortieren

{% for key, value in data.items()|sort(attribute='1.name') %}
  {{ key }}: {{ value }}
{% endfor %}

Das ist die Schleife in der Frage, in die übersetzt wird

{% for team_name, team_attrs in league.items()|sort(attribute='1.totalpts') %}
  <td>{{ team_attrs.totalpts }}</td>
{% endfor %}
1
dpr 28 Nov. 2019 im 10:20

Sie können es mithilfe von sorted nach geordneter Liste sortieren:

league = sorted(league, key= lambda x: -league[x]['totalpts'])
3
Andy Hayden 7 Okt. 2012 im 16:37