Как работает сортировка с ключом?

Сортировка с ключом использует функцию (или ключ), которая преобразует элементы перед сравнением. Вместо сравнения самих элементов, сравниваются результаты применения этой функции к элементам. Это позволяет сортировать по сложным критериям (например, сортировка строк без учета регистра, сортировка объектов по определенному атрибуту, сортировка списка кортежей по второму элементу). Функция `key` передается в методы `sort()` (списка) или `sorted()` (возвращает новый отсортированный список).

Сортировка с ключом (key function) в Python, как правило, используется с функциями sorted() и методом .sort() (списков) для определения логики сортировки, отличной от стандартного прямого сравнения элементов.

Основная идея: Вместо того, чтобы сравнивать непосредственно сами элементы списка, сортировка с ключом использует функцию, которая преобразует каждый элемент в значение, используемое для сравнения. Эта функция называется "ключом сортировки".

Как это работает:

  1. Функция sorted() или .sort() принимает необязательный аргумент key. Этот аргумент принимает функцию (обычно lambda-функцию или заранее определенную функцию).
  2. Для каждого элемента списка вызывается функция, переданная в key.
  3. Результат вызова этой функции (возвращаемое значение) становится "ключом" для сортировки данного элемента.
  4. Элементы списка сортируются на основе этих "ключей", а не самих элементов напрямую.
  5. Возвращается (sorted()) или изменяется (.sort()) список, отсортированный на основе этих ключей.

Преимущества:

  • Гибкость: Позволяет сортировать по сложным критериям, таким как определенное поле объекта, длина строки, абсолютное значение числа и т.д.
  • Эффективность: В некоторых случаях, сортировка с ключом может быть более эффективной, чем написание сложной функции сравнения, особенно если преобразование, необходимое для сортировки, занимает много времени. Ключевая функция вызывается один раз для каждого элемента, а затем результаты используются для множества сравнений.

Примеры:

1. Сортировка списка строк по длине:

words = ["apple", "banana", "kiwi", "orange"]
sorted_words = sorted(words, key=len) # ["kiwi", "apple", "banana", "orange"]

2. Сортировка списка чисел по абсолютному значению:

numbers = [-5, 2, -1, 0, 3]
sorted_numbers = sorted(numbers, key=abs) # [0, -1, 2, 3, -5]

3. Сортировка списка объектов по атрибуту:

class Person:
    def __init__(self, name, age):
      self.name = name
      self.age = age

  people = [Person("Alice", 30), Person("Bob", 25), Person("Charlie", 35)]
  sorted_people = sorted(people, key=lambda person: person.age) # Сортировка по возрасту
  # Результат: [Bob (25), Alice (30), Charlie (35)]
  

Важно помнить: Функция, передаваемая в аргумент key, должна возвращать сравниваемые значения одного типа для всех элементов списка. Иначе, может возникнуть ошибка TypeError.

0