2012-10-07 29 views
13

Tôi vẫn đang học jinja2 và bình và tôi gặp khó khăn khi sử dụng dictsort trong jinja2.Phân loại dict trong jinja2 loop

Vì vậy, tôi đi qua dict này vào một mẫu 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}} 

Những gì tôi muốn là tạo ra một bảng được sắp xếp theo giá trị của 'totalpts' chìa khóa. Tôi đã thử tất cả mọi thứ và nó chỉ không tính đến tổng số khi "phân loại".

Dưới đây là một trong những mã của tôi:

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

bởi nó không sắp xếp bất cứ điều gì trong trường hợp này ... Chỉ cần in giá trị trong bảng mà không cần bất kỳ thứ tự ...

Bất cứ ai cũng có thể giúp tôi ra ngoài?

nhờ

Trả lời

14

Cách bạn đang làm điều này sẽ không làm việc, bởi vì ngay sau khi bạn sử dụng {% for team in league %}, bạn đã sử dụng dict chưa được phân loại và trích xuất cặp khóa, giá trị từ nó.

Tôi nghĩ rằng |dictsort có thể không hỗ trợ bạn trong trường hợp này vì bạn không thể sắp xếp theo khóa hoặc giá trị, nhưng theo giá trị của giá trị (tổng số phụ) cho 'tổng số lần'.

Thay vào đó, bạn nên sắp xếp từ điển này trước đi qua nó để mẫu, theo cách sau:

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

Để sắp xếp dict, chúng tôi chuyển đổi nó thành một danh sách các hàng của (key, giá trị) sử dụng .items(). Giả sử x là một tuple như vậy, x [1] chứa từ điển có khóa 'totalpts'.

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

Vì vậy, bây giờ chúng tôi sắp xếp các bộ sử dụng x[1]['totalpts'], sử dụng reverse=True cho một thứ tự giảm.

Một dict chính nó không thể được sắp xếp, nó là một kiểu dữ liệu có thứ tự - Bạn có thể sử dụng một OrderedDict, hoặc bạn chỉ có thể sử dụng các bộ:

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

Cảm ơn sự giúp đỡ của bạn, câu trả lời của bạn đã làm việc hoàn hảo và giúp tôi học tuples :) – Syl

3

Bạn có thể sắp xếp nó vào một danh sách đặt hàng sử dụng sorted:

+0

Không làm việc. Tôi gặp lỗi này. LoạiError: chỉ số chuỗi phải là số nguyên, không phải là str – Syl

+0

@Syl ooops! đã cập nhật. –

+0

Thực tế nó hoạt động. Tuy nhiên, Anuj câu trả lời là tốt hơn bởi vì tôi vẫn có thể truy cập vào dict thứ 2 với phương pháp của mình. Cảm ơn bạn đã giúp đỡ! – Syl