List sorting with multiple attributes and mixed order
A custom function will render your code more readable. If you have many sorting operations and you don't want to create those functions though, you can use lambda's:
L.sort(lambda x, y: cmp(x.name, y.name) or -cmp(x.year, y.year))
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.
You can't, but writing the compare function is easy:
def my_cmp(a, b):
return cmp(a.foo, b.foo) or cmp(b.bar, a.bar)
L.sort(my_cmp)