Сортировка списка Python по двум полям: алгоритм и решения
Быстрый ответ
Чтобы отсортировать список по двум критериям, воспользуйтесь функцией sorted()
, передав ей в параметр key
кортеж из двух элементов —окажутся именно теми критериями, по которым будет выполняться сортировка. Ниже приведен код, демонстрирующий описанный подход:
# Пусть у нас имеется список словарей
data = [{'name': 'Джон', 'age': 25, 'score': 90},
{'name': 'Доу', 'age': 22, 'score': 95},
{'name': 'Джейн', 'age': 25, 'score': 100}]
# Сортировка сначала по полю 'age', затем по полю 'score'
sorted_data = sorted(data, key=lambda x: (x['age'], x['score']))
Список будет отсортирован в первую очередь по полю 'age'
(возраст), а затем — по полю 'score'
(оценка) в рамках каждого возраста. Это аналогично ситуации, когда парами обуви сначала сортируют по размеру, а затем — по цвету.
Разбор сортировки по нескольким критериям
Стабильность: Суперсила сортировки
Сортировка в Python относится к типу стабильных сортировок: если ключи равны, первоначальный порядок элементов сохраняется. Это свойство особенно важно при сортировке по нескольким полям, как в нашем примере с возрастом и оценкой.
Влияние на производительность
Сортировка по нескольким полям может заметно отразиться на производительности вашего алгоритма. В зависимости от того, используете ли вы lambda
или itemgetter
, скорость выполнения может меняться, поэтому время от времени стоит замерять производительность вашего кода.
Пользовательские функции: VIP-зона сортировки
Если стандартных методов сортировки недостаточно, на помощь могут прийти пользовательские функции. Они позволяют реализовывать комбинированные схемы сравнения, учитывая различные условия, такие как регистронезависимость или смешанные типы данных.
Обратная сортировка: Перевернем все с ног на голову
Сортировка в обратном порядке выглядит сложнее, когда имеется несколько критериев. Важно учесть направление сортировки для каждого поля индивидуально, как будто вы — дирижер оркестра, руководящий исполнением каждого инструмента.
Визуализация
Предположим, у вас на руках колода карт:
Колода: [🂡, 🂱, 🃁, 🃑, 🂢, 🂾]
- Первичная сортировка (масть): 🂠🃁🃑🃞
- Затем внутри каждой масти (номинал): 🂡🂢🂣🂾
Продолжим будто бы укладываем слои торта:
- Первый слой (♠️♣️♥️♦️): масть.
- Второй слой (Т, 2, 3, …, К): номинал в рамках масти.
Применяем аналогичный принцип к данным:
🔢🔤list.sort(key=lambda x: (x.suit, x.rank))
В итоге имеем аккуратно упорядоченную колоду карт:
🂠🂡🂢🂣...🂾 | 🃁🃑🃁🃒...🃞 | 🃑🃒🃑🃓...🃟 | 🂠...
# Сначала упорядочиваем пики по номиналу, затем черви и так далее.
Завершение
Сложные структуры данных и сортировка
Работая со сложными структурами данных, вроде списков классов или вложенных словарей, будьте готовы к тому, что функция key
для сортировки потребует от вас творческого подхода и глубокого понимания структуры данных.
Сортировка на месте: волшебство метода .sort()
В отличие от sorted()
, который создает новый список, метод .sort()
сортирует список на месте. Это может быть весьма полезно при работе с крупными объемами данных, когда возникает потребность экономить память:
# Волшебство сортировки на месте с 'list.sort()'
data.sort(key=lambda x: (x['age'], x['score']))
Сортировка: открывая тайны
Сортировка становится особо важной при работе с различными источниками данных, например, при чтении файлов формата CSV. Преобразуйте содержимое файла в список словарей или кортежей и примените методы сортировки с помощью sorted()
или .sort()
.
Полезные материалы
- Сортировка HOW TO — Документация Python 3.12.2 — официальное руководство по сортировке в Python.
- HowTo/Sorting – Python Wiki — подробные сведения о сортировке и функциях ключей в Python.
- Как использовать лямбда-функции в Python – Real Python — руководство по использованию лямбда-функций в задачах сортировки и не только.
- Встроенные типы — Документация Python 3.12.2 — использование метода
list.sort()
в Python. - Python | Сортировка списка в соответствии с другим списком – GeeksforGeeks — управление сортировкой списка на основе другого списка.
- operator — Стандартные операторы как функции — Документация Python 3.12.2 — использование функции
itemgetter
для сортировки по нескольким аспектам.