2012-10-07 10 views
13

Ich lerne immer noch jinja2 und Kolben und ich habe eine Schwierigkeit mit dictsort in jinja2.Sortieren dict in jinja2 Schleife

ich vorbei dieses dict in eine jinja2 Vorlage Also:

{'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}} 

Was ich will, ist eine Tabelle erstellen, die durch den Wert des Schlüssels ‚totalpts‘ sortiert. Ich habe alle möglichen Dinge ausprobiert und es berücksichtigt einfach nicht die Gesamtmenge beim "Sortieren".

Hier ist eine meiner Code:

 <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> 

durch nichts in diesem Fall sortieren ist ... einfach den Wert in der Tabelle drucken ohne jede Ordnung ...

Jeder kann dabei helfen ich raus?

dank

Antwort

14

Die Art und Weise Sie dies tun, wird nicht funktionieren, weil, sobald Sie {% for team in league %}, verwenden Sie bereits sind Verwenden des unsortierten Diktats und Extrahieren des Schlüssels, Wertpaares daraus.

Ich denke, |dictsort kann Ihnen in diesem Fall möglicherweise nicht helfen, da Sie nicht nach Schlüssel oder Wert sortieren können, sondern nach dem Wert des Werts (sub-dict) für "totalpts".

Stattdessen Sie das Wörterbuch vor sortieren sollte es auf die Vorlage vorbei, auf folgende Weise:

>>> 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})]) 

die dict zu sortieren, wir wandeln es in eine Liste von Tupeln von (Schlüssel, Wert) unter Verwendung von .items(). Unter der Annahme, dass x ein solches Tupel ist, enthält x [1] das Wörterbuch mit der Taste "totalpts".

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

So, jetzt sortieren wir die Tupel x[1]['totalpts'] verwenden, reverse=True für eine abnehmende Reihenfolge.

A dict selbst kann nicht sortiert werden, ist es ein ungeordneter Datentyp - Sie können entweder ein OrderedDict verwenden, oder Sie können einfach Tupeln 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})] 
+0

Danke für deine Hilfe, deine Antwort funktionierte einwandfrei und half mir Tupel zu lernen :) – Syl

3

Sie es zu einer geordneten Liste sortieren konnte sorted mit:,

+0

funktionieren nicht. Ich bekomme diesen Fehler. TypeError: String-Indizes müssen ganze Zahlen sein, nicht str – Syl

+0

@Syl Hoppla! aktualisiert. –

+0

Tatsächlich funktioniert es. Anuj antwortet jedoch besser, weil ich mit seiner Methode immer noch auf das 2. Diktat zugreifen kann. Danke für Ihre Hilfe! – Syl