2012-10-07 13 views
13

Sto ancora imparando jinja2 e flask e sto avendo difficoltà ad usare dictsort in jinja2.Ordina dt in jinja2 loop

Così sto passando questo dict in un modello Jinja2:

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

Quello che voglio è creare una tabella che viene allineati secondo il valore delle '' totalpts chiave. Ho provato tutti i tipi di cose e non prende in considerazione i totalpts quando "ordina".

Ecco uno del mio codice:

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

da essa non ordina nulla in questo caso ... Basta stampare il valore nella tabella, senza alcun ordine ...

Chiunque può aiutare me fuori?

grazie

risposta

14

Il modo in cui si sta facendo questo non funzionerà, perché non appena si utilizza {% for team in league %}, sei già usando il dict non ordinato ed estraendo la chiave, coppia di valori da esso.

Penso che |dictsort potrebbe non essere in grado di aiutarti in questo caso perché non puoi ordinare per chiave o valore, ma per il valore del valore (sub-dict) per "totalpts".

Invece, si dovrebbe risolvere questo dizionario prima di passarlo al modello, nel modo seguente:

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

Per ordinare il dict, convertiamo in una lista di tuple (chiave, valore) utilizzando .items(). Supponendo che x sia una di queste tuple, x [1] contiene il dizionario con la chiave 'totalpts'.

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

Così ora ordinare le tuple utilizzando x[1]['totalpts'], utilizzando reverse=True per ordine decrescente.

Un __dict__ in sé non può essere ordinata, è un tipo di dati non ordinata - È possibile utilizzare un OrderedDict, oppure si può semplicemente utilizzare tuple:

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

Grazie per il tuo aiuto, la tua risposta ha funzionato perfettamente e mi ha aiutato a imparare le tuple :) – Syl

3

Si potrebbe ordinare a un elenco ordinato utilizzando sorted:

+0

non funziona. Ho ricevuto questo errore. TypeError: gli indici stringa devono essere numeri interi, non str – Syl

+0

@Syl ooops! aggiornato. –

+0

In effetti funziona. Tuttavia, la risposta di Anuj è migliore perché posso ancora accedere al secondo dict con il suo metodo. Grazie per l'aiuto! – Syl