I have to sort a list with multiple attributes. I can do that in ascending order for ALL attributes easily with
L.sort(key=operator.attrgetter(attribute))....
but the problem is, that I have to use mixed configurations for ascending/descending... I have to "imitate" a bit the SQL Order By where you can do something like name ASC, year DESC. Is there a way to do this easily in Python without having to implement a custom compare function?
If your attributes are numeric, you have this.
def mixed_order( a ):
return ( a.attribute1, -a.attribute2 )
someList.sort( key=mixed_order )
If your attributes includes strings or other more complex objects, you have some choices.
The .sort() method is stable: you can do multiple passes. This is perhaps the simplest. It's also remarkably fast.
def key1( a ): return a.attribute1
def key2( a ): return a.attribute2
someList.sort( key=key2, reverse=True )
someList.sort( key=key1 )
If this is the only sort, you can define your own special-purpose comparison operators. Minimally, you need __eq__ and __lt__. The other four can be derived from these two by simple logic.
所有评论(0)