sort objects lists python list sorting

objects - Python: clasificación de lista con múltiples atributos y orden mixto



sort python 3 (3)

Tengo que ordenar una lista de python, con múltiples atributos. Puedo hacer eso en orden ascendente para TODOS los atributos fácilmente con

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

pero el problema es que utilizo configuraciones mixtas para ascender / descender ... Tengo que "imitar" un poco el orden de SQL donde puede hacer algo como "nombre ASC, año DESC". ¿Hay alguna manera de hacer esto fácilmente en Python sin tener que implementar una función de comparación personalizada?


No puedes, pero escribir la función de comparación es fácil:

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


Si tus atributos son numéricos, tienes esto.

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

Si sus atributos incluyen cadenas u otros objetos más complejos, tiene algunas opciones.

El método .sort() es estable: puedes hacer varias pasadas. Este es quizás el más simple. También es muy rápido.

def key1( a ): return a.attribute1 def key2( a ): return a.attribute2 someList.sort( key=key2, reverse=True ) someList.sort( key=key1 )

Si esta es la única ordenación, puede definir sus propios operadores de comparación para propósitos especiales. Como mínimo, necesita __eq__ y __lt__ . Los otros cuatro pueden derivarse de estos dos por lógica simple.


Una función personalizada hará que tu código sea más legible. Si tiene muchas operaciones de clasificación y no desea crear esas funciones, puede usar lambda:

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