Как отсортировать список пар по второму элементу в Python
Что проверяют
Знаете ли вы механику сортировки в Python: параметр key, разницу между sorted() и list.sort(), стабильность. Для аналитика следом обычно спрашивают, как сортировать по нескольким ключам и как то же сделать в pandas.
Как отвечать
Базовый ответ в одну строку: sorted(pairs, key=lambda p: p[1]). Дальше покажите, что понимаете детали:
sorted()и.sort(): первый возвращает новый список, второй сортирует на месте и возвращаетNone;operator.itemgetter(1): то же, что лямбда, читается проще и работает чуть быстрее;- стабильность: сортировка в Python стабильна, элементы с равным ключом сохраняют исходный порядок. Сложность
O(n log n), на почти упорядоченных данных быстрее; - несколько ключей:
key=lambda p: (p[1], p[0]). Числовой ключ по убыванию при остальных по возрастанию:key=lambda p: (-p[1], p[0]). Для строк такой трюк не работает, тогда сортируют в два прохода, пользуясь стабильностью: сначала по второстепенному ключу, потом по главному; - по убыванию:
reverse=True, стабильность при этом сохраняется; - строки: регистр влияет на порядок, для сравнения без него есть
key=lambda p: p[1].casefold(); - top-N: если нужны только несколько минимальных,
heapq.nsmallest(k, pairs, key=itemgetter(1))не сортирует весь список.
Для аналитических задач добавьте pandas: df.sort_values("col"), по нескольким столбцам by=[...] и ascending=[False, True]. При сортировке по одному столбцу алгоритм по умолчанию нестабилен, если порядок равных важен, нужен kind="stable".
Где спотыкаются
Пишут pairs = pairs.sort(key=...) и получают None вместо списка.
Для сортировки по убыванию берут sorted(...)[::-1]. Список переворачивается целиком, и равные элементы оказываются в обратном исходному порядке, в отличие от reverse=True.
Не думают о данных: None среди значений даёт TypeError при сравнении, а числа, сохранённые строками, сортируются как "10" раньше "9". Нужен ключ с приведением типа или обработкой пропусков.