私はまだ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>
この場合は何もソートされません...テーブルの値を順序なしで出力するだけです...
誰かが私を助けることができますか?
ありがとう
_{% 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})]
_
sorted
:を使用して、順序付きリストに並べ替えることができます。
league = sorted(league, key= lambda x: -league[x]['totalpts'])
通常の 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 %}