#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
функции заключается в том, чтобы иметь возможность записывать их в более понятном порядке (первичный, вторичный) при вызове функции.
Я думаю, что конкретный пример, приведенный в связанной документации, бесполезен, чтобы продемонстрировать, почему результат будет неправильным, если два прохода сортировки выполняются в обратном порядке, но я не могу придумать лучшего прямо сейчас.