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)