2013-01-23 56 views
1

我寫了一個像這樣的django查詢。指定一個序列號給列表中的字典

stud_record = Student.objects.filter() 

因此,stud_record是一個查詢集。

現在我想要做的是,我要計算stud_record的總次數,然後通過5

將其劃分爲前:我有20個記錄stud_record。除以5後,我得到了4個。所以,現在我想排名前四名學生爲跑1,然後從5-8名學生排名第2 .... 16-20學生排名5.這個排名將被插入到相同的stud_record,將被髮送到模板頁面。

我們該怎麼做。

目前我得到的結構是這樣

[{'name': u'mark', 'roll': 71}, 
{'name': u'robin', 'roll': 42}, 
{'name': u'julien', 'roll': 39}] 

分裂後並插入軍銜它應該看起來像

[[{'name': u'mark', 'roll': 71, 'rank': 1}, 
    {'name': u'robin', 'roll': 42, 'rank': 1},] 
[{'name': u'julien', 'roll': 39, 'rank': 2}]] 

現在我得到185個結果我stud_record。在分割185/5之後,我得到37結果。現在我想給1到1到37名的學生,然後排名2到38-75學生...像這樣

+0

如果有21個學生記錄,結果應該如何? – root

+0

1-5 rank1,6-10等級2 .... 15-21等級5 – sandeep

+0

1-5:1,6-10:2 ... 15-21:5,你如何分配11- 3到4之間是14? – root

回答

0

先加入行列,你的類型的字典,然後將它們分組使用itertools.groupby

from itertools import groupby 

lst = [{} for _ in range(21)] # simple testlist 

def rank_it(lst,n): 
    for index,d in enumerate(lst): 
     rank = index/(len(lst)/n)+1 
     d['rank'] = rank if rank < n else n 

rank_it(lst,5) # add ranks 
[list(g) for _,g in groupby(lst, lambda x: x['rank'])] #group by rank 

出來:

[[{'rank': 1}, {'rank': 1}, {'rank': 1}, {'rank': 1}], 
[{'rank': 2}, {'rank': 2}, {'rank': 2}, {'rank': 2}], 
[{'rank': 3}, {'rank': 3}, {'rank': 3}, {'rank': 3}], 
[{'rank': 4}, {'rank': 4}, {'rank': 4}, {'rank': 4}], 
[{'rank': 5}, {'rank': 5}, {'rank': 5}, {'rank': 5}, {'rank': 5}]] 

NB!此解決方案需要對列表進行排序,如果沒有,請添加: lst.sort(key=lambda x: x['roll'],reverse=True

0

嘗試使用Len(stud_record)。這將爲您提供該查詢集的學生人數。然後玩弄分區和模塊來獲得您想要的學生範圍。對不起,我不能給你一個明確的解決方案,我目前使用的筆記本電腦沒有安裝Python程序。希望這會有所幫助:)

+0

是的,我得到stud_record的總數。但沒有得到邏輯如何分配隊伍取決於分裂的結果...;( – sandeep

0

你反對自己在你想要什麼的問題。你想要的示例代碼有一個學生名單,每個名單都有一個等級。但你你想給一個子列表中的所有學生分配相同的排名。這是兩回事。

,來給出訂單號爲列表中的每個記錄做到這一點:

for rank, student in enumerate(student_list): 
    student['rank'] = rank 

對於一個子表給同級別所有記錄,你可以這樣做:

for rank, student_list in enumerate(all_students): 
    for student in student_list: 
     student['rank'] = rank 

但這當你將主列表拆分爲子列表時,最後一件事情確實更容易,甚至完全無關緊要,而不是之後。

爲您創建的每個子列表執行此操作。

也不要插入到stud_record中,而是將結果添加到上下文中。在基於班級的視圖中,您可以這樣做:

def get_context_data(self, **kwargs): 
    # Call the base implementation first to get a context 
    context = super(KlassDetailView, self).get_context_data(**kwargs) 
    # Add data to the context: 
    stud_record = Student.objects.filter() 
    context['stud_ranks'] = calculate_ranks(stud_record) 
    return context 

現在,您已在模板中提供'stud_ranks'變量。

+0

是的,這是對的,但我怎麼可以分配第一1-4名學生作爲第一名,然後下一組學生等級2等.. – sandeep

+0

@sandeep:更新 –

+0

我想這是烏拉圭回合調用此方法應該是什麼的定義 – sandeep

0

我會去這樣

iter=0 
for item in sorted(stud_record, key=lambda x:x['roll']): 
    item['rank'] = math.floor(iter/5) + 1) 
    iter+=1 

您您的項目通過「滾」排序,並分配被觀察五個組重新分配一個「等級」字段。

+0

在'__future__',這種劃分將導致浮動。所以最好'math.floor(iter/5)+ 1)'。 – bouke

+1

感謝評論!!! – octoback

相關問題