首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获取django dict数据中的前5项记录

如何获取django dict数据中的前5项记录
EN

Stack Overflow用户
提问于 2022-07-22 05:55:42
回答 3查看 58关注 0票数 0

我有两张桌子去看病。访问有一列疾病的桌子。我正试着从餐桌上得到前五名的疾病。

代码语言:javascript
运行
复制
dis=disease.objects.all()
for d in dis:
    v=visits.objects.filter(disease=d.disease_name).count()    
    data={
    d.disease_name : v
    }
    print (data)

此打印所有疾病与各自的计数。详情如下:

代码语言:javascript
运行
复制
{'Headache': 2}
{'Cold': 1}
{'Cough': 4}
{'Dog Bite': 0}
{'Fever': 2}
{'Piles': 3}
{'Thyroid': 4}
{'Others': 9}

我想从这个列表中根据计数得到前五名。该怎么做呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-07-22 09:21:47

谢谢你们的答复,我有另外一个简单的解决办法。

代码语言:javascript
运行
复制
    from django.db.models import Count
x = visits.objects.values('disease').annotate(disease_count=Count('disease')).order_by('-disease_count')[:5]
    print(x)

它返回如下:

代码语言:javascript
运行
复制
<QuerySet [{'disease': 'Others', 'disease_count': 9}, {'disease': 'Thyroid', 'disease_count': 4}, {'disease': 'Cough', 'disease_count': 4}, {'disease': 'Piles', 'disease_count': 3}, {'disease': 'Headache', 'disease_count': 2}]>

我认为这是最简单的解决办法。它对我有效..。

票数 2
EN

Stack Overflow用户

发布于 2022-07-22 07:33:25

您可以通过编写这样的代码对这些值进行排序:

代码语言:javascript
运行
复制
diseases = list(Disease.objects.values_list('disease_name', flat=True))
visits = list(
    Visits.objects.filter(disease__in=diseases).values_list('disease', flat=True))
data = {}
for name in diseases:
    count = visits.count(name)
    data[name] = count
sorted_data = sorted(data.items(), key=operator.itemgetter(1), reverse=True)
new_data = {}
for idx in range(min(len(sorted_data), 5)):
    item = sorted_data[idx]
    new_data[item[0]] = item[1]
print(new_data)

虽然有点混乱,但它确实起了作用:

我还优化了您的查询,因此代码也应该运行得更快(当您执行这样的逻辑时,使用list.values_list(...),因为它在内存中缓存数据-使用list上的原生python函数而不是.count()之类的QuerySet也应该比访问数据库更快)。

票数 1
EN

Stack Overflow用户

发布于 2022-07-22 08:35:56

根据所需内容在列表和排序列表中添加数据:

代码语言:javascript
运行
复制
dis=disease.objects.all()
l = list()
for d in dis:
    v=visits.objects.filter(disease=d.disease_name).count()    
    data={
        d.disease_name : v
    }
    l.append(data)

l.sort(reverse=True, key=lambda x:list(x.values())[0])
for i in range(min(len(l), 5)):
    print(l[i])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73075681

复制
相关文章

相似问题

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