繁体   English   中英

在 jinja2 循环中对 dict 进行排序

[英]Sort dict in jinja2 loop

我仍在学习 jinja2 和烧瓶,并且在 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”的值排序的表。 我尝试了各种方法,但在“排序”时并没有考虑总数。

这是我的代码之一:

        <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 %} ,你就已经在使用 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 进行排序,我们使用.items()将其转换为 (key ,value) 的元组列表。 假设 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})]

您可以使用普通sort过滤器对 dict 的项目进行sort

要按键排序,请使用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 %}

您可以使用sorted将其排序为有序列表:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM