为列表中的字典分配序列号

时间:2013-01-23 07:06:02

标签: python django

我写过像这样的django查询。

stud_record = Student.objects.filter()

因此,stud_record是一个查询集。

现在我想做的是,我想计算stud_record的总数,然后将其除以5.

例如:我在stud_record中有20条记录。除以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}]]

现在我在我的stud_record中得到185个结果。在划分185/5后,我得到了37分。现在我想给1到1-37名学生,然后排名2到38-75名学生......就像这样

4 个答案:

答案 0 :(得分:0)

尝试使用Len(stud_record)。这将为您提供该查询集的学生人数。然后玩分裂和模数来获得你想要的学生范围。对不起,我无法给你一个明确的解决方案,我正在使用的笔记本电脑没有安装Python程序。希望这会有所帮助:)

答案 1 :(得分: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

但是当你将主列表拆分成sub_lists而不是之后,这最后的事情肯定更容易,甚至是完全无关紧要。

为您创建的每个子列表执行此操作。

也不要将其插入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'变量。

答案 2 :(得分:0)

我会这样做

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

您可以通过'roll'对项目进行排序,并指定一个在五个分区中观察重新分区的“排名”字段。

答案 3 :(得分:0)

首先在您的dicts中添加排名,然后使用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