在Python中有没有一种方法可以以自定义方式对自定义对象进行排序?

在Python中有没有一种方法可以以自定义方式对自定义对象进行排序?,python,sorting,python-3.x,Python,Sorting,Python 3.x,我使用web.py来加速端点,因此,我提供了一个端点列表,如下所示 urls = ('/(.*)', 'base', '/shapes/(.*)', 'shapes', '/sounds/(.*)', 'sounds', '/shapes/rectangualar/(.*)', 'rectangualarShapes', '/sounds/loud/(.*)', 'loudSounds') 由于web.py将看到第一个端点

我使用web.py来加速端点,因此,我提供了一个端点列表,如下所示

urls = ('/(.*)', 'base', 
        '/shapes/(.*)', 'shapes', 
        '/sounds/(.*)', 'sounds', 
        '/shapes/rectangualar/(.*)', 'rectangualarShapes', 
        '/sounds/loud/(.*)', 'loudSounds')
由于web.py将看到第一个端点并将所有可能的端点与之匹配,因此需要对它们进行排序,首先是最具体的,即

urls = ('/shapes/rectangualar/(.*)', 'rectangualarShapes', 
        '/shapes/(.*)', 'shapes',
        '/sounds/loud/(.*)', 'loudSounds' 
        '/shapes/(.*)', 'shapes', 
        '/sounds/(.*)', 'sounds',
        '/(.*)', 'base')
我想按URI订购这些。首先,如果有一种简单的方法,比如元组,那就太好了,但我想我需要将它们转换成对象

class Endpoint(object):
    def __init__(self, id, classname):
        self.id = id
        self.classname = classname

    def getId(item):
        return self.id
然后
打印排序(endpointList,key=id)
它们。在Python3+中如何实现这一点?我见过比较器函数,但它们似乎已被弃用

进行自定义排序的最佳方法是什么

sorted(endpointList, key=lambda endpoint: endpoint.id)

id
是一个内置函数,它执行您不想要的其他操作,因此您的代码无法工作

首先,如果有一个简单的方法来做它,作为元组,它将是伟大的

不在自定义对象中换行:

from itertools import chain
from operator import itemgetter

sorted_urls = tuple(chain.from_iterable(sorted(zip(urls[::2],
                                                   urls[1::2]),
                                               key=itemgetter(0), reverse=True)))
如果您不喜欢使用
,请使用生成器表达式展平:

tuple(x for pair in sorted(zip(urls[::2], urls[1::2]),
                           key=itemgetter(0), reverse=True)
      for x in pair)

还有
key=operator.attrgetter('id','classname')
这不起作用,结果:[/(.*))>'base',/shapes/(.*))>'shapes',/shapes/rectangular/(.*)->'rectangularshapes',/sounds/(.*)->'sounds',/sounds/loud/(.-)>'loudSounds']不太具体的
/(.
url仍然在列表的顶部。排序不只是尝试按字母顺序进行吗?对不起,我刚刚看到
key=id
,并跳到这一点,认为这是一个可能的问题。是的,它是按字母顺序排列的。我不知道如何根据具体情况订购。但关键函数确实是对列表进行排序的常用方法。如果你真的只想用一个比较器函数来表达这个问题,请查看
functools.cmp_to_key
。@Ilja Everilä的解决方案实际上效果很好:)没有尝试第一个,但第二个很有效。现在我需要弄清楚它是如何工作的:PIt使用
zip()构建两个元组
(路径、名称)
,从索引0和1开始以2为增量,使用
itemgetter(0)
(根据需要更改键)按照
path
对它们进行反向排序,并将结果平铺回元组。为。。。对于扁平化的语法有点糟糕,因为最内层的for实际上离结果表达式最远。真正让我困惑的是,它如何区分细粒度URL和粗粒度URL,而不只是尝试按字母顺序排序。它只是按字母顺序排序,只是颠倒过来。您还可以使用类似于
lambda pair:(len(pair[0]),pair[0])
的方法进行排序,如果颠倒的话,可以按字母顺序从最长到最短进行排序。总而言之,我想最好的办法就是按照正确的顺序开始配置:PReally?这很奇怪,因为它似乎按粒度进行了预期的排序。我需要做一些更高级的测试。遗憾的是,我的代码无法预先知道所有元组条目,正如您所看到的。。。
tuple(x for pair in sorted(zip(urls[::2], urls[1::2]),
                           key=itemgetter(0), reverse=True)
      for x in pair)