我正在使用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+中执行此操作?我遇到了比较器函数,但它们似乎已被弃用。
进行自定义排序的最佳方法是什么?
答案 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)