19

私はまだjinja2とflaskを学んでいて、jinja2でdictsortを使用するのに苦労しています。

だから私はこのdictを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」の値でソートされたテーブルを作成することです。私はいろいろなことを試しましたが、「並べ替え」の際に合計が考慮されていません。

これが私のコードの1つです:

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

この場合は何もソートされません...テーブルの値を順序なしで出力するだけです...

誰でも私を助けることができますか?

ありがとう

4

3 に答える 3

19

を使用するとすぐに{% for team in league %}、ソートされていない辞書を使用し、そこからキーと値のペアを抽出しているため、これを行う方法は機能しません。

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

dict をソートするには、 を使用して (key ,value) のタプルのリストに変換し.items()ます。x がそのようなタプルの 1 つであると仮定すると、x[1] には「totalpts」キーを持つ辞書が含まれます。

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

そこで、 を使用してタプルをソートしx[1]['totalpts']、 を使用reverse=Trueして降順でソートします。

dict 自体はソートできません。順序付けされていないデータ型です。 を使用するか、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})]
于 2012-10-07T10:56:23.893 に答える
3

次を使用して、順序付きリストに並べ替えることができますsorted

league = sorted(league, key= lambda x: -league[x]['totalpts'])
于 2012-10-07T09:23:26.610 に答える