Python:列表sorting与多个属性和混合顺序

我必须sorting一个Python列表,具有多个属性。 我可以做到这一点升序所有属性很容易与

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

但问题是,我已经使用混合configuration升序/降序…我必须“模仿”一些SQL顺序在哪里你可以做一些像“名称ASC,年降序”。 有没有办法做到这一点,而不必实现一个自定义的比较函数在python中?

如果你的属性是数字的,你有这个。

 def mixed_order( a ): return ( a.attribute1, -a.attribute2 ) someList.sort( key=mixed_order ) 

如果你的属性包含string或其他更复杂的对象,你有一些select。

.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__ 。 其他四个可以通过简单的逻辑从这两个派生。

自定义函数将使您的代码更具可读性。 如果你有很多的sorting操作,你不想创build这些函数,你可以使用lambda:

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

你不能,但是编写比较函数很简单:

 def my_cmp(a, b): return cmp(a.foo, b.foo) or cmp(b.bar, a.bar) L.sort(my_cmp)