Как сортировать списки в Python?

онлайн тренажер по питону
Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Методы сортировки списков в Python: полное руководство

Сортировка данных — важный элемент работы практически в любом приложении. От обработки пользовательского ввода до сложных алгоритмов анализа данных. В Python работа со списками интуитивно проста. Инструменты сортировки предоставляют гибкость и мощные возможности.

Основы работы со списками в Python

Списки в Python представляют собой упорядоченные изменяемые коллекции объектов. Они позволяют хранить элементы различных типов данных и обеспечивают удобный доступ к ним по индексу.

numbers = [5, 2, 9, 1, 5, 6]
words = ["banana", "apple", "cherry"]
mixed_list = [1, "hello", 3.14, True]

Основные методы сортировки списков

Python предоставляет два основных способа сортировки списков: метод sort() и функция sorted(). Каждый из них имеет свои особенности и области применения.

Метод sort() — сортировка на месте

Метод sort() изменяет исходный список и возвращает None. Этот подход эффективен по памяти, поскольку не создает новый список.

numbers = [5, 2, 9, 1]
numbers.sort()
print(numbers)  # [1, 2, 5, 9]
Параметры метода sort()

Метод sort() принимает следующие параметры:

  • reverse: определяет направление сортировки (True для убывания, False для возрастания)
  • key: функция, определяющая критерий сортировки
numbers = [5, 2, 9, 1]
numbers.sort(reverse=True)
print(numbers)  # [9, 5, 2, 1]

Функция sorted() — создание нового списка

Функция sorted() возвращает новый отсортированный список, не изменяя исходный. Это полезно, когда необходимо сохранить оригинальный порядок элементов.

numbers = [5, 2, 9, 1]
new_numbers = sorted(numbers)
print(new_numbers)  # [1, 2, 5, 9]
print(numbers)      # [5, 2, 9, 1] — исходный список не изменился
Сортировка по убыванию с sorted()
numbers = [5, 2, 9, 1]
sorted_desc = sorted(numbers, reverse=True)
print(sorted_desc)  # [9, 5, 2, 1]

Сравнение методов сортировки

Метод Изменяет список Возвращает значение Использование
sort() Да Нет (None) Когда не нужен исходный порядок
sorted() Нет Новый список Когда нужно сохранить исходные данные

Сортировка строк в списках

Алфавитная сортировка

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

words = ["banana", "apple", "cherry"]
words.sort()
print(words)  # ['apple', 'banana', 'cherry']

Сортировка по убыванию

words = ["banana", "apple", "cherry"]
words.sort(reverse=True)
print(words)  # ['cherry', 'banana', 'apple']

Работа с регистром при сортировке строк

Чувствительность к регистру

По умолчанию сортировка учитывает регистр символов. Заглавные буквы идут перед строчными в ASCII таблице:

words = ["Banana", "apple", "Cherry"]
print(sorted(words))  # ['Banana', 'Cherry', 'apple']

Игнорирование регистра

Для сортировки без учета регистра используется параметр key=str.lower:

words = ["Banana", "apple", "Cherry"]
print(sorted(words, key=str.lower))  # ['apple', 'Banana', 'Cherry']

Сортировка сложных структур данных

Сортировка списка словарей

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

students = [
    {"name": "Alice", "grade": 85},
    {"name": "Bob", "grade": 90},
    {"name": "Charlie", "grade": 80}
]
sorted_students = sorted(students, key=lambda x: x["grade"])
print(sorted_students)

Результат:

[{'name': 'Charlie', 'grade': 80}, {'name': 'Alice', 'grade': 85}, {'name': 'Bob', 'grade': 90}]

Многокритериальная сортировка

Для сортировки по нескольким критериям используется кортеж в параметре key:

students = [
    {"name": "Alice", "grade": 85, "age": 20},
    {"name": "Bob", "grade": 85, "age": 19},
    {"name": "Charlie", "grade": 90, "age": 21}
]
sorted_students = sorted(students, key=lambda x: (x["grade"], x["age"]))

Сортировка чисел с математическими функциями

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

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

import math
numbers = [-5, 3, -2, 8, -1]
sorted_numbers = sorted(numbers, key=abs)
print(sorted_numbers)  # [-1, -2, 3, -5, 8]

Сортировка по квадрату числа

numbers = [-3, 1, -2, 4, -1]
sorted_by_square = sorted(numbers, key=lambda x: x**2)
print(sorted_by_square)  # [-1, 1, -2, -3, 4]

Использование пользовательских функций для сортировки

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

def by_length(word):
    return len(word)

words = ["Python", "AI", "Machine Learning", "Data"]
sorted_words = sorted(words, key=by_length)
print(sorted_words)  # ['AI', 'Data', 'Python', 'Machine Learning']

Сортировка по количеству гласных

def count_vowels(word):
    vowels = "aeiouAEIOU"
    return sum(1 for char in word if char in vowels)

words = ["hello", "world", "python", "programming"]
sorted_by_vowels = sorted(words, key=count_vowels)
print(sorted_by_vowels)  # ['world', 'python', 'hello', 'programming']

Использование классов для кастомной сортировки

Определение метода сравнения в классе

class Student:
    def __init__(self, name, grade):
        self.name = name
        self.grade = grade
    
    def __lt__(self, other):
        return self.grade < other.grade
    
    def __repr__(self):
        return f"Student('{self.name}', {self.grade})"

students = [Student("Alice", 85), Student("Bob", 90), Student("Charlie", 80)]
students.sort()
for s in students:
    print(f"{s.name}: {s.grade}")

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

from operator import attrgetter

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def __repr__(self):
        return f"Person('{self.name}', {self.age})"

people = [Person("Alice", 25), Person("Bob", 30), Person("Charlie", 20)]
sorted_people = sorted(people, key=attrgetter('age'))
print(sorted_people)

Высокопроизводительная сортировка с NumPy

Для работы с большими числовыми массивами библиотека NumPy предоставляет оптимизированные алгоритмы сортировки:

import numpy as np

arr = np.array([5, 2, 9, 1, 8, 3])
sorted_arr = np.sort(arr)
print(sorted_arr)  # [1 2 3 5 8 9]

# Сортировка по убыванию
sorted_desc = np.sort(arr)[::-1]
print(sorted_desc)  # [9 8 5 3 2 1]

Сортировка многомерных массивов

import numpy as np

arr_2d = np.array([[3, 1, 4], [2, 5, 1], [1, 3, 2]])
sorted_2d = np.sort(arr_2d, axis=1)  # Сортировка по строкам
print(sorted_2d)

Продвинутые техники сортировки

Стабильная сортировка

Python использует стабильный алгоритм сортировки (Timsort), который сохраняет относительный порядок равных элементов:

students = [
    ("Alice", 85),
    ("Bob", 90),
    ("Charlie", 85),
    ("David", 90)
]
# Сортировка по оценке сохранит порядок студентов с одинаковыми оценками
sorted_students = sorted(students, key=lambda x: x[1])

Обратная сортировка без параметра reverse

numbers = [5, 2, 9, 1]
sorted_reverse = sorted(numbers, key=lambda x: -x)
print(sorted_reverse)  # [9, 5, 2, 1]

Часто задаваемые вопросы

Как работает параметр key в функции sorted()?

Параметр key принимает функцию, которая определяет критерий сортировки. Функция применяется к каждому элементу списка, и сортировка происходит по возвращаемым значениям.

Чем отличается sorted() от list.sort()?

Функция sorted() создает новый список и не изменяет исходный. Метод sort() изменяет существующий список на месте и возвращает None.

Можно ли сортировать списки по нескольким критериям?

Да, используя кортеж в параметре key:

sorted(items, key=lambda x: (x["field1"], x["field2"]))

Как сортировать список чисел по убыванию?

numbers.sort(reverse=True)
# или
sorted_numbers = sorted(numbers, reverse=True)

Как сделать сортировку нечувствительной к регистру?

sorted(words, key=str.lower)

Как отсортировать список в обратном порядке?

numbers.reverse()  # Просто обращает порядок элементов
# или
sorted(numbers, reverse=True)  # Сортирует по убыванию

Практические рекомендации

Освоив методы sort() и sorted(), а также работу с параметрами key и reverse, вы сможете эффективно сортировать любые данные. От простых чисел до сложных структур данных.

Экспериментируйте с пользовательскими функциями сортировки и лямбда-выражениями. Это откроет дополнительные возможности при работе с данными и поможет решать более сложные задачи обработки информации.

Новости