具有多个属性和混合顺序的列表排序

问题描述 投票:19回答:3

我必须对具有多个属性的列表进行排序。我可以轻松地按升序对所有属性执行此操作]

L.sort(key=operator.attrgetter(attribute))....

但是问题是,我必须使用混合配置进行升序/降序...我必须稍微模仿一下SQL Order By,在其中可以执行类似name ASC, year DESC的操作。有没有一种方法可以在Python中轻松实现而无需实现自定义比较功能?

python list sorting
3个回答
29
投票

如果属性是数字,则具有此属性。

def mixed_order( a ):
    return ( a.attribute1, -a.attribute2 )

someList.sort( key=mixed_order )

如果您的属性包括字符串或其他更复杂的对象,则可以选择。

.sort()方法很稳定:您可以进行多次通过。这也许是最简单的。它也非常快。

def key1( a ): return a.attribute1
def key2( a ): return a.attribute2

someList.sort( key=key2, reverse=True )
someList.sort( key=key1 )

如果这是唯一的排序,则可以定义自己的专用比较运算符。最少需要__eq____lt__。其他四个可以通过简单的逻辑从这两个派生。


7
投票

自定义功能将使您的代码更具可读性。如果您有很多排序操作,但又不想创建这些函数,则可以使用lambda的:

L.sort(lambda x, y: cmp(x.name, y.name) or -cmp(x.year, y.year))

6
投票

您不能,但是编写比较功能很容易:

def my_cmp(a, b):
    return cmp(a.foo, b.foo) or cmp(b.bar, a.bar)
L.sort(my_cmp)
© www.soinside.com 2019 - 2024. All rights reserved.