Подтвердить что ты не робот

Python: сортировка списка с несколькими атрибутами и смешанным порядком

Мне нужно отсортировать список python с несколькими атрибутами. Я могу сделать это в порядке возрастания для ВСЕХ атрибутов легко с помощью

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

но проблема в том, что у меня есть смешанные конфигурации для восходящего/нисходящего... Мне нужно "подражать" бит SQL-заказа. Здесь вы можете сделать что-то вроде "name ASC, year DESC". Есть ли способ сделать это легко в python без необходимости выполнять пользовательскую функцию сравнения?

4b9b3361

Ответ 1

Если ваши атрибуты являются числовыми, у вас есть это.

def mixed_order( a ):
    return ( a.attribute1, -a.attribute2 )

someList.sort( key=mixed_order )

Если ваши атрибуты содержат строки или другие более сложные объекты, у вас есть выбор.

Метод .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__. Остальные четыре могут быть получены из этих двух с помощью простой логики.

Ответ 2

Пользовательская функция сделает ваш код более читаемым. Если у вас много операций сортировки, и вы не хотите создавать эти функции, вы можете использовать lambda's:

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

Ответ 3

Вы не можете, но написать функцию сравнения легко:

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