2012-10-21 27 views
1

我需要重新組織一個列表,而不是按結果列表中的項目數顯示結果。django重組和按列表長度排序

是這樣的:

{% regroup car_models by make as car_models_by_make %} 

{% for make in car_models_by_make|dictsort:"???" --> the problem %} 
    {{ make.grouper }} ({{ make.list|length }}) <br> 
{% endfor %} 

因此,如果數據是:

[ 
('panda','fiat'), 
('500','fiat'), 
('focus','ford') 
] 

的結果應該是:

fiat 2 
ford 1 

我想:dictsort:「make.list。計數「,」make.list.length「,」make.list |長度「..沒有工作..

回答

0

使用我做了這個模板標籤:

@register.filter() 
def groups_sort(groups): 

    groups.sort(key=lambda group: len(group['list'])) 
    return groups 

@register.filter() 
def groups_sort_reversed(groups): 
    groups.sort(key=lambda group: len(group['list']), reverse=True) 
    return groups 

這是可能做到這一點:

{% load custom_templatetags %} 
{% regroup car_models by make as car_models_by_make %} 

{% for make in car_models_by_make|groups_sort_reversed %} 
    {{ make.grouper }} ({{ make.list|length }}) <br> 
{% endfor %} 

會給你

fiat 2 
ford 1 

使用groups_sort會給你:

ford 1 
fiat 2 

本課程適用於Django模型過於

享受

2

我不認爲dictsort適合在這裏。

>>> l = [('panda', 'fiat'), ('500', 'fiat'), ('focus', 'ford')] 
>>> values = [i[1] for i in l] 
>>> from collections import Counter 
>>> c = Counter(values) 
>>> c.most_common() 
[('fiat', 2), ('ford', 1)] 

您可以定義自己的template tags

from django import template 
from collections import Counter 

register = template.Library() 

@register.filter 
def my_sort(l): 
    values = [i[1] for i in l] 
    c = Counter(values) 
    return c.most_common() 
+0

感謝imom0。你確定沒有更好的解決方案嗎?如果沒有生病必須接受你的.. – YardenST

+0

@YardenST對不起,我不確定,但「完成勝過知府」。如果你使用'dictsort',參數必須是字典的關鍵。 – iMom0

1

你應該通過你的數據的模板類型的字典排序列表:

>>> data = [ ('panda','fiat'), 
... ('500','fiat'), 
... ('focus','ford') ] 
>>> 
>>> from itertools import groupby 

# note that we need to sort data before using groupby 
>>> groups = groupby(sorted(data, key=lambda x: x[1]), key=lambda x:x[1]) 

# make the generators into lists 
>>> group_list = [(make, list(record)) for make, record in groups] 

# sort the group by the number of car records it has 
>>> sorted_group_list = sorted(group_list, key=lambda x: len(x[1]), reverse=True) 

# build the final dict to send to the template 
>>> sorted_car_model = [{'make': make, "model": r[0]} for (make, records) in sorted_group_list for r in records] 
>>> sorted_car_model 
[{'make': 'fiat', 'model': 'panda'}, {'make': 'fiat', 'model': '500'}, {'make': 'ford', 'model': 'focus'}] 

這裏的目標是要排序列表,使汽車製造商按照他們生產的車型數量排名。

然後,使用方法:

{% regroup car_models by make as make_list %} 

{% for item in make_list %} 
    {{ item.grouper }} ({{ item.list|length }}) <br> 
{% endfor %} 

獲得:

fiat 2 
ford 1 

Referece:regroup


如果您的數據看起來就像你在你的意見有一個:

>>> car_models = [ 
...  {'make': 'ford', 'model': 'focus'}, 
...  {'make': 'fiat', 'model': 'panda'}, 
...  {'make': 'ford', 'model': '500'}, 
...  {'make': 'fiat', 'model': '500'}, 
...  {'make': 'opel', 'model': '500'}, 
...  {'make': 'opel', 'model': '500'}, 
...  {'make': 'opel', 'model': '500'}, 
... ] 
>>> 
>>> groups = groupby(sorted(car_models, key=lambda x:x['make']), key=lambda x:x['make']) 
>>> groups = [(make, list(x)) for make, x in groups] 
>>> sorted_group_list = sorted(groups, key=lambda x:len(x[1]), reverse=True) 
>>> sorted_car_model = [{'make': make, 'model': r['model']} for (make, records) in sorted_group_list for r in records] 

>>> sorted_car_model 
[{'make': 'opel', 'model': '500'}, {'make': 'opel', 'model': '500'}, {'make': 'opel', 'model': '500'}, {'make': 'fiat', 'model': 'panda'}, {'make': 'fiat', 'model': '500'}, {'make': 'ford', 'model': 'fo 
cus'}, {'make': 'ford', 'model': '500'}] 

或者,你可以將結果傳遞給模板類似如下:

>>> from collections import Counter 
>>> l = [r['make'] for r in car_models] 
>>> c = Counter(l) 
>>> result = [{k: v} for k,v in dict(c).iteritems()] 
>>> result = sorted(result, key=lambda x: x.values(), reverse=True) 
[{'opel': 3}, {'fiat': 2}, {'ford': 2}] 

然後,這個結果傳遞給模板,只是簡單地呈現結果,而不是:

{% for r in result %} 
    {% for k,v in r.items %} 
     {{ k }} {{ v }} 
    {% endfor %}j 
{% endfor %} 

然後您將獲得:

opel 3 
fiat 2 
ford 2 
+0

這不會按組的列表長度對結果進行排序。 考慮: car_models = {'make':'ford','model':'focus'}, {'make':'fiat', 'model':'panda'}, {'make':'ford','model':'500'}, {'make':'fiat','model':'500'}, { make':'opel','model':'500'}, {'make':'opel','model':'500'}, {'make':'opel','model':' 500'}, ] – YardenST

+1

@YardenST啊是的,你是對的,我忘了你想要一個排序的一個。我將用一個工作解決方案更新答案。 –

+0

@YardenST更新了一個可以正常工作的解決方案。 –