Почему спецификации меняются местами в следующем фрагменте кода для мультисортировки по куче атрибутов объекта?

#python #sorting

#python #сортировка

Вопрос:

Следующая функция принимает кортеж (атрибут, reverse_order) и сортирует заданный список xs для каждого из них. Почему здесь используется reversed?

 def multisort(xs, specs):
    for key, reverse in reversed(specs):
        xs.sort(key=attrgetter(key), reverse=reverse)
    return xs
 

Ссылка на документацию: https://docs.python.org/3/howto/sorting.html

Ответ №1:

Это объясняется в примере, который мотивирует multisort функцию:

Это замечательное свойство позволяет создавать сложные сортировки за несколько этапов сортировки. Например, чтобы отсортировать данные учащихся по убыванию оценки, а затем по возрастанию возраста, сначала выполните сортировку по возрасту, а затем снова отсортируйте с помощью grade:

 >>> s = sorted(student_objects, key=attrgetter('age'))     # sort on secondary key 
>>> sorted(s, key=attrgetter('grade'), reverse=True)       # now sort on primary key, descending
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
 

Чтобы логика сортировки была правильной, вам нужно сначала выполнить сортировку по вторичному ключу, а затем по первичному ключу.

Причина изменения клавиш сортировки внутри multisort функции заключается в том, чтобы иметь возможность записывать их в более понятном порядке (первичный, вторичный) при вызове функции.


Я думаю, что конкретный пример, приведенный в связанной документации, бесполезен, чтобы продемонстрировать, почему результат будет неправильным, если два прохода сортировки выполняются в обратном порядке, но я не могу придумать лучшего прямо сейчас.