0Pricing
Coding Interview Prep · Урок

Пользовательский порядок с 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 — локальная установка не требуется.

Все уроки этого курса

  1. sorted() и функция key
  2. Сортировка по нескольким полям
  3. Пользовательский порядок с functools.cmp_to_key
  4. Почему сортировка открывает путь к решениям
← Назад к Coding Interview Prep