【问题标题】:Django / Python unorderable types Story() < Story() with sorting function具有排序功能的 Django / Python 不可排序类型 Story() < Story()
【发布时间】:2014-02-27 10:25:43
【问题描述】:

我目前正在使用 Django Unchained TutsPlus 课程从头开始学习 Django,我已经创建了一个 top_stories 函数来对每个故事进行排序,每个故事从 1 分开始。

我尝试了很多东西,例如将 abs 放在 score 函数的 return 周围,但这会导致负分变为正分,当每个故事具有相同的分数时出现主要问题,因为然后它通过排序我认为的故事?

Python 版本 - 3.3.3

Django 版本 - 1.6.1

这是显示的错误

ERROR - unorderable types: Story() < Story()

views.py - 第 16 行导致问题,排序在的行

import datetime
from django.shortcuts import render
from django.http import HttpResponse
from django.template import loader, Context
from django.utils.timezone import utc
from stories.models import Story

def score(story, gravity=1.8, timebase=120):
    points = (story.points - 1)**0.8
    now = datetime.datetime.utcnow().replace(tzinfo=utc)
    age = int((now - story.created_at).total_seconds())/60 # minutes since story was posted
    return points/(age+timebase)**gravity

def top_stories(top=180, consider=1000):
    latest_stories = Story.objects.all().order_by('-created_at')[:consider]
    ranked_stories = sorted([(score(story), story) for story in latest_stories], reverse=True)
    return [story for score, story in ranked_stories][:top]


def index(request):
    stories = top_stories(top=10)
    response = '''
    <html>
    <head>
           <title>Tuts+ News</title>
    </head>
    <body>
       <ol>
       %s
       </ol>
    </body>
    </html>
    ''' % '\n'.join(['<li>%s</li>' % story.title for story in stories])
    return HttpResponse(response)

我将非常感谢您对此的任何帮助,我已经尝试修复它一段时间了

【问题讨论】:

    标签: python django sorting typeerror


    【解决方案1】:

    使用key 函数给商店打分:

    ranked_stories = sorted(latest_stories, key=score, reverse=True)
    return ranked_stories[:top]
    

    这消除了对您正在使用的 decorate-sort-undecorate 模式的需求,并且很高兴地避免了在没有订购支持的情况下比较单个 Story 实例。

    您可能应该在此处改用heapq,并避免对整个列表进行排序:

    import heapq
    
    return heapq.nlargest(top, latest_stories, key=score)
    

    heapq.nlargest() 调用在计算上不如完整排序复杂; topconsider 相比越小,在性能方面的差异就越大。

    【讨论】:

    • 非常感谢您的快速响应,完美运行,一直在寻找修复方法
    • 补充答案:排序失败的原因是因为 Python 对元组进行排序的方式是比较第一个元素,如果它们等价,则比较第二个元素。我猜在这种情况下,你一定是打了个平手,所以它去了第二个元素以试图打破平手——此时它发现 Story 对象不可排序。
    • Claudiu 是的,我认为这就是它发生的原因,虽然很奇怪,因为它适用于正在做教程的人的计算机
    • @theo3335796:要么是因为在他的机器上他没有使用 Python 3,所以他扩充了 Story 类以添加排序支持(__eq____lt__ 等),或者他没有有任何与测试集相同的分数。
    • @MartijnPieters 哦,是的,因为他从另一个网站上抓取了他的故事,所以它们都会有不同的分数,我想我可能发现了一个错误,哈哈。我也实现了 heapq,谢谢你的提示!有什么理由比 sorted() 快吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 2021-01-07
    • 2016-05-20
    相关资源
    最近更新 更多