2012-10-07 127 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