ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Исправляем ошибку при сортировке с lambda в Python 2.x и 3.x

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если вам нужно отсортировать список в Python в соответствии с особыми критериями, вы можете использовать функцию lambda в качестве параметра key функции sorted(). Например, чтобы упорядочить список кортежей по второму элементу, выполните следующую операцию:

Python
Скопировать код
# Имеем список с фруктами 🍎🍊🍐
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:

Python
Скопировать код
# Меняем порядок фруктов в списке 🔄
sorted_tuples_desc = sorted(my_tuples, key=lambda x: x[1], reverse=True)

Тогда результат будет таков: [(1, 'pear'), (3, 'orange'), (2, 'apple')] – те же фрукты, но в обратном порядке.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Использование lambda для сортировки объектов по атрибутам

Лямбда-функции могут быть идеально применимы не только для работы с кортежами или базовыми типами данных, но и для сортировки объектов, например, списков экземпляров классов, которые вы определите.

Сортировка по нескольким атрибутам

Иногда может возникнуть необходимость упорядочивать данные по нескольким критериям. Предположим, у вас есть список книг, который нужно отсортировать по году выпуска и по названию:

Python
Скопировать код
# Мыслимы книги 📚
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=. Если вы забудете сделать это, не забудьте еще раз проверить код!

Особенности сортировки строк

При сортировке строк иногда может быть полезным учесть не только алфавитный порядок, но и длину строк:

Python
Скопировать код
# Снова к нашим фруктам 🍏🍎
strings = ['banana', 'pie', 'apple', 'cherry']

# Сортируем строки сначала по длине, а затем в лексикографическом порядке
sorted_strings = sorted(strings, key=lambda x: (len(x), x))

# Пирог оказался на первом месте 🥧🍏🍎🍌

Меняем сортировку прямо в списке!

Если вам необходимо сортировать список на месте, используйте метод sort(), который тоже позволяет использовать параметры key= и reverse=:

Python
Скопировать код
# Работаем с числами 🎲
numbers = [3, 1, 4, 1, 5, 9, 2, 6]

# Применяем lambda-функцию для сортировки 🦸‍♂️
numbers.sort(key=lambda x: -x)

Визуализация

Можно представить сортировку с использованием lambda в Python как упорядочивание книг 📚 на книжной полке по числу страниц:

Markdown
Скопировать код
Несортированная книжная полка: [📚(500стр), 📚(200стр), 📚(300стр)]

Теперь, предположим, что lambda – это ваш личный библиотекарь:

Python
Скопировать код
sorted_books = sorted(books, key=lambda book: book.pages)

И вуаля – книги расставлены в порядке от самой тонкой до самой толстой:

Markdown
Скопировать код
Сортированная книжная полка: [📚(200стр), 📚(300стр), 📚(500стр)]

Теперь романы занимают свои места, от легкого чтения до многотомных эпопей. 🧠

Понимание особенностей функции functools.cmp_to_key

В Python 3.x можно преобразовать пользовательскую функцию сравнения в функцию-ключ для сортировки, используя метод cmp_to_key. Вот как это работает:

Python
Скопировать код
# Готовимся к магии сортировки 🧙‍♂️
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.

Полезные материалы

  1. Руководство по сортировке — Документация Python 3.12.2
  2. 4. Дополнительные управляющие структуры — Документация Python 3.12.2
  3. Глоссарий — Документация Python 3.12.2
  4. operator — Стандартные операторы в виде функций — Документация Python 3.12.2
  5. Как использовать sorted() и .sort() в Python – Real Python
  6. HowTo/Sorting – Python Wiki
  7. Лямбда/Анонимная функция в Python (с примерами)