2012-10-07 14 views
13

私はまだjinja2とフラスコを学んでいますが、私はjinja2でdictsortを使うのが難しいです。jinja2ループで辞書をソート

だから私は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}} 

私が欲しいキー「totalpts」の値によってソートされたテーブルを作成することです。私はあらゆる種類のことを試してみました。

誰でも助けることができる...それによって

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

ちょうど任意の順序なしのテーブル内の値を印刷し...このケースで何かをソートしません:

は、ここに私のコードの一つです私は出る?

おかげ

答えて

14

あなたがこれをやっている方法は動作しません、とすぐに{% for team in league %}を使用すると、あなたはすでにしているので、ソートされていないdictを使用し、そこからキー、値のペアを抽出します。

私は|dictsortは、キーまたは値ではなく、 'totalpts'の値(サブディクテーション)の値で並べ替えることができないため、このケースでお手伝いできない可能性があります。

代わりに、あなたは次のように、テンプレートに渡す前に、この辞書を並べ替える必要があります。辞書をソートするには

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

、我々は(キー、値のタプルのリストに変換).items()を使用します。 xがこのようなタプルの1つであると仮定すると、x [1]には 'totalpts'キーを持つ辞書が含まれています。

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

だから今、私たちは降順のためreverse=Trueを使用して、x[1]['totalpts']を使用してタプルを並べ替えます。

辞書自体はソートすることができない、それは順序付けられていないデータ型です - あなたはOrderedDictを使用するか、単にタプルを使用することができます。

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

あなたの助けてくれてありがとう、あなたの答えは完璧に働いて、私はタプルを学ぶのを助けます:) – Syl

3

あなたはsortedを使用して順序付けられたリストにそれを並べ替えることができます:

+0

は動作しません。私はこのエラーが発生します。 TypeError:文字列インデックスはstrでなく整数でなければなりません – Syl

+0

@Syl ooops!更新しました。 –

+0

実際に動作します。しかし、私はまだ彼の方法で2番目のdictにアクセスすることができるので、Anujの答えは良いです。ご協力いただきありがとうございます! – Syl