Пользовательский порядок с functools.cmp_to_key
Пишите компаратор, когда ключей недостаточно
«Пользовательский порядок с functools.cmp_to_key» — бесплатный урок Coding Interview Prep на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Coding Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Coding Interview Prep содержит 4 уроков всего.
Когда key не может выразить нужный порядок
Некоторые порядки зависят от сравнения двух элементов между собой, а не от отдельного значения каждого. В таких случаях вместо key напишите функцию компаратора.
Что возвращает компаратор
Компаратор принимает два элемента a и b. Верните отрицательное число, если первым идёт a, положительное — если первым идёт b, и ноль при равенстве.
def cmp(a, b):
if a < b: return -1
if a > b: return 1
return 0Соедините его с cmp_to_key
Python sort принимает только key, поэтому оберните компаратор с помощью functools.cmp_to_key, чтобы превратить его в пригодный key.
from functools import cmp_to_key
items.sort(key=cmp_to_key(cmp))Классическая задача о самом большом числе
Чтобы склеить числа в самую большую строку, сравнивайте пары по тому, какая конкатенация получается больше. Обычный key не может выразить такое правило.
def cmp(a, b):
return (a + b < b + a) - (a + b > b + a)Разберите этот приём сравнения
Выражение возвращает -1, когда a+b даёт более большую склейку, поэтому a сортируется перед b. Так строится максимально возможное число.
nums = ["3", "30", "34"]
nums.sort(key=cmp_to_key(cmp))
print("".join(nums)) # 34330Важен знак
Сортировка учитывает только знак результата. Возврат -2 или -100 работает так же, как -1, поэтому точное значение не имеет значения.
Соблюдайте согласованность компараторов
Ваш компаратор должен быть согласованным: если a лучше b, а b лучше c, то a должно быть лучше c. Противоречия приводят к беспорядку.
По возможности предпочитайте key
key вычисляется один раз для каждого элемента, а компаратор запускается для множества пар и работает медленнее. Используйте cmp_to_key только тогда, когда key действительно не подходит.
Сокращённый приём с вычитанием
Для числовых сравнений можно напрямую вернуть a - b, поскольку его знак уже задаёт порядок. Это коротко и безопасно для целых чисел.
items.sort(key=cmp_to_key(lambda a, b: a - b))Остерегайтесь чисел с плавающей точкой
Для чисел с плавающей точкой a - b может округлиться до очень малого значения или нуля. Используйте явные ветви сравнения, чтобы избежать ошибочных равенств.
Компараторы открывают путь к особым порядкам
Становятся возможны порядок конкатенации, пользовательские ранги и разрешение равенств по правилам. Компаратор — Ваш инструмент для сложных сортировок.
Быстрая проверка
Ваш компаратор возвращает отрицательное число для cmp(a, b).
Итоги
Теперь Вы умеете оборачивать компаратор с помощью cmp_to_key для порядков, которые нельзя выразить через key. Возвращайте знак, соблюдайте согласованность и по возможности предпочитайте key. 🧩
Часто задаваемые вопросы
Урок «Пользовательский порядок с functools.cmp_to_key» бесплатный?
Да — полный текст урока «Пользовательский порядок с functools.cmp_to_key» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Coding Interview Prep, подпишись на CoddyKit PRO. Курс Coding Interview Prep содержит 4 уроков всего.
Чему я научусь в уроке «Пользовательский порядок с functools.cmp_to_key»?
Пишите компаратор, когда ключей недостаточно Ты практикуешь Coding Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Coding Interview Prep?
Предыдущий опыт не требуется. Coding Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Пользовательский порядок с functools.cmp_to_key»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Coding Interview Prep?
Да. Каждый урок Coding Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- sorted() и функция key
- Сортировка по нескольким полям
- Пользовательский порядок с functools.cmp_to_key
- Почему сортировка открывает путь к решениям