按特定的类属性对列表中的Python对象进行排序

时间:2018-08-23 03:23:10

标签: python sorting object

我已经考虑了一段时间,但是我不确定如何最好地解决这个问题。 我要解决的问题如下:

a)假设您从相同类型的对象列表开始。 b)每个对象都有一个字符串类型的名称属性。 c)该列表应按每个对象内的名称属性按字母数字顺序进行排序,但某些名称元素必须位于已排序列表的顶部。

我认为我可能必须先进行常规排序,然后过滤掉那些优先排序的元素,然后将它们从列表中拉出,然后将它们插入列表的顶部。这可能会起作用,但听起来效率很低。有人能想到一种使用Python 2.7或3的更Python化的方法吗?

谢谢!

1 个答案:

答案 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]