Исправляем ошибку при сортировке с lambda в Python 2.x и 3.x
Быстрый ответ
Если вам нужно отсортировать список в Python в соответствии с особыми критериями, вы можете использовать функцию lambda в качестве параметра key
функции sorted()
. Например, чтобы упорядочить список кортежей по второму элементу, выполните следующую операцию:
# Имеем список с фруктами 🍎🍊🍐
my_tuples = [(1, 'pear'), (2, 'apple'), (3, 'orange')]
# Применяем lambda-функцию для сортировки 🏋️♂️
sorted_tuples = sorted(my_tuples, key=lambda x: x[1])
Выводом данного кода будет [(2, 'apple'), (3, 'orange'), (1, 'pear')]
, список отсортированный по названиям фруктов в алфавитном порядке. Для обратной сортировки воспользуйтесь параметром reverse=True
:
# Меняем порядок фруктов в списке 🔄
sorted_tuples_desc = sorted(my_tuples, key=lambda x: x[1], reverse=True)
Тогда результат будет таков: [(1, 'pear'), (3, 'orange'), (2, 'apple')]
– те же фрукты, но в обратном порядке.
Использование lambda для сортировки объектов по атрибутам
Лямбда-функции могут быть идеально применимы не только для работы с кортежами или базовыми типами данных, но и для сортировки объектов, например, списков экземпляров классов, которые вы определите.
Сортировка по нескольким атрибутам
Иногда может возникнуть необходимость упорядочивать данные по нескольким критериям. Предположим, у вас есть список книг, который нужно отсортировать по году выпуска и по названию:
# Мыслимы книги 📚
books = [{'title': 'Brave New World', 'year': 1932},
{'title': '1984', 'year': 1949},
{'title': 'Animal Farm', 'year': 1945}]
# Упорядочиваем списка книг по году, а при равенстве – по названию
sorted_books = sorted(books, key=lambda x: (x['year'], x['title']))
Чтобы избежать ошибок при использовании функции sorted с lambda, убедитесь, что корректно использовали параметр key=
. Если вы забудете сделать это, не забудьте еще раз проверить код!
Особенности сортировки строк
При сортировке строк иногда может быть полезным учесть не только алфавитный порядок, но и длину строк:
# Снова к нашим фруктам 🍏🍎
strings = ['banana', 'pie', 'apple', 'cherry']
# Сортируем строки сначала по длине, а затем в лексикографическом порядке
sorted_strings = sorted(strings, key=lambda x: (len(x), x))
# Пирог оказался на первом месте 🥧🍏🍎🍌
Меняем сортировку прямо в списке!
Если вам необходимо сортировать список на месте, используйте метод sort()
, который тоже позволяет использовать параметры key=
и reverse=
:
# Работаем с числами 🎲
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
# Применяем lambda-функцию для сортировки 🦸♂️
numbers.sort(key=lambda x: -x)
Визуализация
Можно представить сортировку с использованием lambda в Python как упорядочивание книг 📚 на книжной полке по числу страниц:
Несортированная книжная полка: [📚(500стр), 📚(200стр), 📚(300стр)]
Теперь, предположим, что lambda – это ваш личный библиотекарь:
sorted_books = sorted(books, key=lambda book: book.pages)
И вуаля – книги расставлены в порядке от самой тонкой до самой толстой:
Сортированная книжная полка: [📚(200стр), 📚(300стр), 📚(500стр)]
Теперь романы занимают свои места, от легкого чтения до многотомных эпопей. 🧠
Понимание особенностей функции functools.cmp_to_key
В Python 3.x можно преобразовать пользовательскую функцию сравнения в функцию-ключ для сортировки, используя метод cmp_to_key
. Вот как это работает:
# Готовимся к магии сортировки 🧙♂️
from functools import cmp_to_key
# Ваша функция сравнения – в главных ролях
def compare_items(a, b):
return (a > b) – (a < b)
# Все элементы списка удачно упорядочены
sorted_list = sorted(items, key=cmp_to_key(compare_items))
Как исправить ошибки
Беспокоиться из-за ошибок при сортировке не стоит! Вы всегда можете легко понять, где ошиблись, благодаря сообщениям об ошибках. В зависимости от версии Python сообщения могут отличаться, но в первую очередь всегда проверяйте параметр key=
.
Отладка
- Для сортировки по датам используйте
key=lambda x: x.date_attribute
. - Если вам придется столкнуться со сложными структурами данных, такими как списки словарей и списки, воспользуйтесь
key=lambda x: x['list_key'][index]
. - Помните особенность Python: при сортировке
True
считается за 1, аFalse
– за 0.
Полезные материалы
- Руководство по сортировке — Документация Python 3.12.2
- 4. Дополнительные управляющие структуры — Документация Python 3.12.2
- Глоссарий — Документация Python 3.12.2
- operator — Стандартные операторы в виде функций — Документация Python 3.12.2
- Как использовать sorted() и .sort() в Python – Real Python
- HowTo/Sorting – Python Wiki
- Лямбда/Анонимная функция в Python (с примерами)