我已经考虑了一段时间,但是我不确定如何最好地解决这个问题。 我要解决的问题如下:
a)假设您从相同类型的对象列表开始。 b)每个对象都有一个字符串类型的名称属性。 c)该列表应按每个对象内的名称属性按字母数字顺序进行排序,但某些名称元素必须位于已排序列表的顶部。
我认为我可能必须先进行常规排序,然后过滤掉那些优先排序的元素,然后将它们从列表中拉出,然后将它们插入列表的顶部。这可能会起作用,但听起来效率很低。有人能想到一种使用Python 2.7或3的更Python化的方法吗?
谢谢!
答案 0 :(得分:1)
您可以为key
函数指定sorted
属性。 key
可以是任何函数,因此可以封装您的逻辑。
获得排序优先级的一种常见方法是依靠tuple
排序。您key
将因此返回(priority, attribute)
对。
def priority_sort_key(attr, priority, default=float('inf')):
def key_func(obj):
key = getattr(obj, attr)
return (priority.get(key, default), key)
return key_func
class SimpleObject:
def __init__(self, name):
self.name = name
def __repr__(self):
return self.name
lst = [SimpleObject('apple'), SimpleObject('banana'), SimpleObject('foo')]
priority = {
'foo': 1,
}
print(sorted(lst, key=priority_sort_key('name', priority)))
[foo, apple, banana]