首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为列表中的字典分配序列号

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

Stack Overflow用户
提问于 2013-01-23 15:06:02
回答 4查看 187关注 0票数 1

我已经写了一个这样的django查询。

代码语言:javascript
复制
stud_record = Student.objects.filter()

因此,stud_record是一个查询集。

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

例如:我在stud_record中有20条记录。除以5后,我得到4。因此,现在我想将前四名学生排名为ran 1,然后将5-8名学生排名为2…16-20名学生排名为5。此排名将被插入到相同的stud_record中,并将发送到模板页面。

我们怎么才能做到。

目前我得到的结构是这样的

代码语言:javascript
复制
[{'name': u'mark', 'roll': 71}, 
 {'name': u'robin', 'roll': 42}, 
 {'name': u'julien', 'roll': 39}]

在除法和插入秩之后,它应该看起来像

代码语言:javascript
复制
[[{'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的学生…像这样

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-23 17:07:22

首先将排名添加到字典中,然后使用itertools.groupby对它们进行分组

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
[[{'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}]]

注意!此解决方案需要对列表进行排序,如果没有,请添加:lst.sort(key=lambda x: x['roll'],reverse=True__)

票数 0
EN

Stack Overflow用户

发布于 2013-01-23 15:15:00

尝试使用Len(stud_record)。这将为您提供该查询集的学生数量。然后使用除法和模数来得到你想要的学生范围。很抱歉,我不能给你一个明确的解决方案,因为我目前使用的笔记本电脑没有安装Python程序。希望这能有所帮助:)

票数 0
EN

Stack Overflow用户

发布于 2013-01-23 15:18:44

你在关于你想要什么的问题上自相矛盾。您想要的示例代码有一个学生列表,每个学生都有一个排名。但是您说您想要将相同的排名分配给子列表中的所有学生。这是两件不同的事情。

要为列表中的每条记录提供订单号,请执行以下操作:

代码语言:javascript
复制
for rank, student in enumerate(student_list):
    student['rank'] = rank

为了向子列表中的所有记录提供相同的排名,您可以这样做:

代码语言:javascript
复制
for rank, student_list in enumerate(all_students):
    for student in student_list:
        student['rank'] = rank

但是,当您将主列表拆分成sub_lists时,这最后一件事肯定会更容易,甚至完全是微不足道的,而不是之后。

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

此外,不要将其插入到stud_record中,而是将结果添加到上下文中。在基于类的视图中,您可以这样做:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14474186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档