Подтвердить что ты не робот

Сортировка dict в цикле jinja2

Я все еще изучаю jinja2 и флягу, и у меня возникают трудности с использованием dictsort в jinja2.

Итак, я передаю этот 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". Я пробовал всевозможные вещи, и он просто не учитывает 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>

в этом случае ничего не сортирует... Просто напечатайте значение в таблице без какого-либо заказа...

Кто-нибудь может мне помочь?

спасибо

4b9b3361

Ответ 1

То, как вы это делаете, не будет работать, потому что, как только вы используете {% for team in league %}, вы уже используете unsorted 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})])

Чтобы отсортировать dict, мы преобразуем его в список кортежей (key, value) с помощью .items(). Предполагая, что x является одним из таких кортежей, 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})]

Ответ 2

Вы можете отсортировать его по заказу, используя sorted:

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