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

时间:2016-05-20 09:45:29

标签: python sorting python-3.x

我正在使用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

print sorted(endpointList, key=id)他们。我将如何在Python 3+中执行此操作?我遇到了比较器函数,但它们似乎已被弃用。

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

2 个答案:

答案 0 :(得分:1)

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

sorted(endpointList, key=Endpoint.getId)

id是一个内置函数,它可以执行您不需要的其他操作,因此您的代码无法正常工作。

答案 1 :(得分:1)

  

首先,如果有一种简单的方法可以做到,那就像元组那样很棒

不包装自定义对象:

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)))

如果使用chain不是你的事,请使用生成器表达式展平:

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