2016-05-25 13 views
0

Ich verwende eine Jinja2 Vorlage, um Informationen zu einem Bericht zu rendern. Ich erstelle eine Tabelle, die die max, total, avg_size und avg_rate für bestimmte Arten von Ereignissen zeigt, die auf dem System auftreten.Ordering Wörterbuch Werte auf Jinja2 Vorlage

Mein Code erstellt nach jeweils 6 Einträgen eine neue Zeile und druckt Daten, die korrekt aussehen. Bei genauerer Betrachtung werden die Daten jedoch nicht in der richtigen Reihenfolge gedruckt, da ich 'if' Anweisungen verwende.

Gibt es weg ich key2=='max_count' immer die erste machen können, ist es Wert zu drucken, dann key2 == 'total' und etc.

Die Reihenfolge Ich möchte:

max_count, total, avg_size, avg_rate 

Hier ist der Teil meines Codes das Problem verursacht :

{% for key2, value2 in max_min_data[key].iteritems() %} 
    {% if count == 6 %} 
    </tr> 
    <tr> 
    {% set count = 0 %} 
    {% endif %} 
    {% if key2 == 'max_count'%} 
    <td style="text-align: center; width:3.1in;">{{ '{0:,}'.format(value2['max']) }}</td> 
    {% endif %} 
    {% if key2 == 'total'%} 
    <td style="text-align: center; width:3.1in;">{{'{0:,}'.format(value2['max'])}}</td> 
    {% endif %} 
    {% if key2 == 'avg_size'%} 
    <td style="text-align: center; width:3.1in;">{{'{0:,}'.format(value2['max'])}}</td> 
    {% endif %} 
    {% if key2 == 'avg_rate'%} 
    <td style="text-align: center; width:3.1in;">{{'{0:,}'.format(value2['max'])}}</td> 
    {% endif %} 
    {% set count = count + 1 %} 
{% endfor %} 

Beispiel Wörterbuch ich Schleifen:

{ 
    'Event1': { 
     'avg_rate': {'max': 11004, 'min': 0}, 
     'avg_size': {'max': 219, 'min': 218}, 
     'total': {'max': 107743, 'min': 103354}, 
     'max_count': {'max': 103756, 'min': 103094} 
    }, 
    'Event2': { 
     'avg_rate': {'max': 558, 'min': 0}, 
     'avg_size': {'max': 321, 'min': 319}, 
     'total': {'max': 11029, 'min': 10046}, 
     'max_count': {'max': 17724, 'min': 17585} 
    }, 
    'Event3': { 
     'avg_rate': {'max': 1824, 'min': 0}, 
     'avg_size': {'max': 363, 'min': 360}, 
     'total': {'max': 48737, 'min': 46529}, 
     'max_count': {'max': 47094, 'min': 46711} 
    } 
} 
+0

können Sie auch die Daten schreiben Sie Schleifen über? –

+0

@NilsWerner Ich habe ein Beispiel für das Wörterbuch, das ich durchschlinge, geschrieben – Catherine

+0

Das nächste Mal formatieren Sie bitte auch das Diktat, damit Leute es lesen können (tat das für Sie). Sie scheinen zwei Schleifen zu verwenden, um das Diktat zu durchlaufen. Können Sie mehr Kontext und die gewünschte Ausgabe posten? –

Antwort

0

Es stellte sich heraus eine weit einfachere Lösung sein, als ich dachte. Ich änderte meine Jinja2 Vorlage auf die folgende und das das Problem für mich gelöst:

{% for key2, value2 in max_min_data[key].iteritems() %} 

    <td style="text-align: center; width:3.1in;">{{ '{0:,}'.format(value['max_count']['max']) }}</td> 
    <td style="text-align: center; width:3.1in;">{{'{0:,}'.format(value['total']['max'])}}</td> 
    <td style="text-align: center; width:3.1in;">{{'{0:,}'.format(value['avg_size']['max'])}}</td> 
    <td style="text-align: center; width:3.1in;">{{'{0:,}'.format(value['avg_rate']['max'])}}</td> 

{% endfor %} 
0

Standardwörterbücher in Python sind nicht geordnet. Sie können OrderedDict von collections Modul in Standardbibliothek verwenden:

from collections import OrderedDict 


d = { 
    'Event1': OrderedDict([ 
     ('avg_rate', {'max': 11004, 'min': 0}), 
     ('avg_size', {'max': 219, 'min': 218}), 
     ('total', {'max': 107743, 'min': 103354}), 
     ('max_count', {'max': 103756, 'min': 103094}) 
    ]), 
    'Event2': OrderedDict([ 
     ('avg_rate', {'max': 558, 'min': 0}), 
     ('avg_size', {'max': 321, 'min': 319}), 
     ('total', {'max': 11029, 'min': 10046}), 
     ('max_count', {'max': 17724, 'min': 17585}) 
    ]), 
    'Event3': OrderedDict([ 
     ('avg_rate', {'max': 1824, 'min': 0}), 
     ('avg_size', {'max': 363, 'min': 360}), 
     ('total', {'max': 48737, 'min': 46529}), 
     ('max_count', {'max': 47094, 'min': 46711}) 
    ]) 
} 

for event in d: 
    print(event) 
    for key in d[event]: 
     print('\t{}'.format(key)) 

Ausgang:

Event2 
    avg_rate 
    avg_size 
    total 
    max_count 
Event3 
    avg_rate 
    avg_size 
    total 
    max_count 
Event1 
    avg_rate 
    avg_size 
    total 
    max_count 
Verwandte Themen