web-dev-qa-db-ja.com

jinja2ループでdictを並べ替える

私はまだ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>

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

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

ありがとう

17
Syl

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

この場合、キーまたは値ではなく、「totalpts」の値(サブディクテーション)の値で並べ替えることができないため、_|dictsort_は役に立たないと思います。

代わりに、次の方法で、この辞書を並べ替える必要がありますbeforeテンプレートに渡します。

_>>> 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をソートするには、.items()を使用して(key、value)のタプルのリストに変換します。 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})]
_
18
Anuj Gupta

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

league = sorted(league, key= lambda x: -league[x]['totalpts'])
3
Andy Hayden

通常の sort フィルターを使用して、dictのアイテムを並べ替えることができます。

キーで並べ替えるには、attribute=0を使用します。

{% for key, value in data.items()|sort(attribute='0') %}
  {{ key }}: {{ value }}
{% endfor %}

値で並べ替えるには、attribute=1を使用します

{% for key, value in data.items()|sort(attribute='1') %}
  {{ key }}: {{ value }}
{% endfor %}

値の属性で並べ替えるには、attribute=1.nameを使用します

{% for key, value in data.items()|sort(attribute='1.name') %}
  {{ key }}: {{ value }}
{% endfor %}

それは質問のループがに変換されます

{% for team_name, team_attrs in league.items()|sort(attribute='1.totalpts') %}
  <td>{{ team_attrs.totalpts }}</td>
{% endfor %}
2
dpr