2012-10-07 59 views
13

我仍然在学习jinja2和flask,并且在jinja2中使用dictsort时遇到困难。在jinja2循环中排序字典

所以我通过这个字典到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> 

由它不会在这种情况下,任何排序...只要打印表中的值没有任何顺序...

任何人都可以帮助我出去了?

感谢

回答

14

你这样做是行不通的方式,因为一旦你使用{% 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})]) 

要排序的字典,我们将它转​​换成(键,值元组的列表)使用.items()。假设x是一个这样的元组,x [1]包含带有'totalpts'键的字典。

>>> league.items()[0] 
('Fc Paris', {'id': 1538051, 'rank': 2, 'totalpts': 396}) # = x 

所以,现在我们使用reverse=True的递减顺序使用x[1]['totalpts']元组进行排序。

的字典本身不能进行排序,这是一个无序的数据类型 - 您可以使用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})] 
+0

感谢您的帮助,您的答案完美无缺地帮助我学习元组:) – Syl

3

你可以使用它sorted排序,排序列表:

+0

不工作。我得到这个错误。 TypeError:字符串索引必须是整数,而不是str – Syl

+0

@Syl ooops!更新。 –

+0

确实有效。然而,Anuj的回答更好,因为我仍然可以用他的方法访问第二个字典。谢谢你的帮助! – Syl