在jinja2循环中对dict进行排序

时间:2012-10-07 09:16:15

标签: python flask jinja2

我还在学习jinja2和flask,我在jinja2中使用dictsort时遇到了困难。

所以我将这个字典传递给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>

它在这种情况下不会对任何内容进行排序...只需打印表中的值而不需要任何顺序......

任何人都可以帮助我吗?

感谢

3 个答案:

答案 0 :(得分:17)

您执行此操作的方式无效,因为只要您使用{% for team in league %},就已经使用了未排序的dict并从中提取了键值对。

我认为|dictsort在这种情况下可能无法帮助您,因为您无法按键或值排序,而是按'totalpts'的值(sub-dict)值排序。

相反,您应该按照以下方式将此词典排在之前将其传递给模板:

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

您可以使用常规的sort过滤器对字典中的项目进行排序。

要按键排序,请使用function getCandidate(subSet, set){ const filtered = Object.values(set).filter(key => subSet.includes(key)).reduce((obj, key) => { obj[key] = set[key] return obj }, {}) }

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