Python: сортировка списка с несколькими атрибутами и смешанным порядком
Мне нужно отсортировать список python с несколькими атрибутами. Я могу сделать это в порядке возрастания для ВСЕХ атрибутов легко с помощью
L.sort(key=operator.attrgetter(attribute))....
но проблема в том, что у меня есть смешанные конфигурации для восходящего/нисходящего... Мне нужно "подражать" бит SQL-заказа. Здесь вы можете сделать что-то вроде "name ASC, year DESC".
Есть ли способ сделать это легко в python без необходимости выполнять пользовательскую функцию сравнения?
Ответы
Ответ 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)