Алфавитная сортировка в Python: от простого к сложному

Раздел: Основы Python -> Сортировка

Сортировка по алфавиту в Python

Наиболее эффективный способ сортировки списка строк по алфавиту в Python - использование встроенной функции sorted() или метода списка list.sort() с параметром key=str.lower для регистронезависимой сортировки. Этот подход учитывает стандартный порядок Unicode, что обычно достаточно для латиницы и кириллицы. Пример:

words = ["яблоко", "Апельсин", "Банан", "груша"]
sorted_words = sorted(words, key=str.lower)
print(sorted_words)

Python sort key (сортировка с параметром key в python)

['Апельсин', 'Банан', 'груша', 'яблоко']

Python sort lambda (сортировка с lambda в python)

Примечание:

использование str.lower приводит все строки к нижнему регистру для сравнения, не изменяя оригиналы. Если требуется сортировка с учётом регистра (заглавные перед строчными), параметр key можно опустить.

Как отсортировать строки по алфавиту с учётом регистра?

Вызов sorted() без ключа даёт порядок, основанный на кодах Unicode. Заглавные буквы (A-Z) имеют меньшие коды, чем строчные (a-z), поэтому строки, начинающиеся с заглавной, будут идти первыми.

items = ["cat", "Banana", "apple", "Dog"]
print(sorted(items))

сортировка по алфавиту python (сортировка по алфавиту в python)

['Banana', 'Dog', 'apple', 'cat']

Python числа в порядке возрастания (сортировка чисел по возрастанию в python)

Проблема: разный регистр приводит к неочевидному порядку. Решение - использовать key=str.lower или key=lambda s: s.casefold() для более агрессивного приведения.

Как сделать сортировку без учёта регистра?

Параметр key принимает функцию, которая преобразует каждый элемент перед сравнением. str.lower - один из вариантов. Альтернатива - str.casefold(), который лучше обрабатывает символы, например немецкое ß.

fruits = ["Äpfel", "äpfel", "Banane", "bAnAnE"]
print(sorted(fruits, key=str.casefold))

Python сортировка по значению (сортировка по значению в python)

['äpfel', 'Äpfel', 'Banane', 'bAnAnE']
Ошибка: забыть указать key. Результат может быть неожиданным, если список содержит смешанный регистр. Также str.lower не идеально работает для всех локалей.

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

Используйте параметр reverse=True.

names = ["Иван", "Анна", "Борис", "Елена"]
names.sort(reverse=True)
print(names)
['Иван', 'Елена', 'Борис', 'Анна']

Обратная сортировка применяется после применения ключа, если он задан.

Как сортировать строки с учётом правил конкретного языка (локали)?

Стандартная сортировка Python использует код Unicode, который не всегда соответствует алфавиту языка (например, для польского, чешского). Модуль locale позволяет задать локаль и использовать locale.strxfrm для преобразования строк в порядок, заданный локалью.

import locale
locale.setlocale(locale.LC_COLLATE, 'ru_RU.UTF-8')
words = ["ёлка", "ель", "жираф", "заяц"]
sorted_words = sorted(words, key=locale.strxfrm)
print(sorted_words)
['ель', 'ёлка', 'жираф', 'заяц']
Проблема: локаль должна быть установлена в системе. В Windows названия локалей отличаются, например 'Russian_Russia.1251'. Без вызова setlocale strxfrm может работать с настройками по умолчанию. Альтернатива - библиотека pyuca для Unicode collation algorithm.

Как отсортировать список объектов по строковому атрибуту?

Используйте key с лямбда-функцией или функцию operator.attrgetter.

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

people = [Person("Вера"), Person("Антон"), Person("Борис")]
people.sort(key=lambda p: p.name.lower())
print(people)
[Антон, Борис, Вера]
Если атрибут у некоторых объектов равен None, сортировка вызовет ошибку TypeError. Решение - обработать None через key=lambda x: (x is None, x.lower()) или использовать functools.cmp_to_key с пользовательской функцией сравнения.

Как сортировать строки по нескольким критериям (например, сначала по длине, потом по алфавиту)?

Верните кортеж из ключей. Сравнение кортежей происходит поэлементно.

data = ["aa", "b", "ccc", "ab", "ba"]
sorted_data = sorted(data, key=lambda s: (len(s), s.lower()))
print(sorted_data)
['b', 'aa', 'ab', 'ba', 'ccc']

Сортировка путей по имени файла

Пример
import os
paths = ["/home/user/file2.txt", "/home/user/file10.txt", "/home/user/file1.txt"]
sorted_paths = sorted(paths, key=lambda p: os.path.basename(p).lower())
print(sorted_paths)
['/home/user/file1.txt', '/home/user/file10.txt', '/home/user/file2.txt']

Обратите внимание: file10 идёт после file1 из-за лексикографического сравнения. Для натуральной сортировки чисел используйте библиотеку natsort.

Натуральная сортировка (natsort)

Пример
from natsort import natsorted
names = ["ver2", "ver10", "ver1", "ver20"]
print(natsorted(names, key=lambda s: s.lower()))
['ver1', 'ver2', 'ver10', 'ver20']

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

Пример
employees = [
    {"name": "Иван", "age": 30},
    {"name": "Анна", "age": 25},
    {"name": "Борис", "age": 35}
]
sorted_employees = sorted(employees, key=lambda emp: emp["name"].casefold())
print(sorted_employees)
[{'name': 'Анна', 'age': 25}, {'name': 'Борис', 'age': 35}, {'name': 'Иван', 'age': 30}]

Сортировка с пользовательским компаратором (cmp_to_key)

Пример
from functools import cmp_to_key

def compare(a, b):
    if len(a) != len(b):
        return len(a) - len(b)
    return (a.lower() > b.lower()) - (a.lower() < b.lower())

strings = ["zz", "aa", "bb", "a", "ccc"]
sorted_strings = sorted(strings, key=cmp_to_key(compare))
print(sorted_strings)
['a', 'aa', 'bb', 'zz', 'ccc']

Сортировка строк с игнорированием пробелов и знаков препинания

Пример
import re
def clean(s):
    return re.sub(r'[^\w\s]', '', s).lower()

phrases = ["Hello, world!", "hello world", "Hello World!"]
print(sorted(phrases, key=clean))
['hello world', 'Hello, world!', 'Hello World!']

Сортировка по алфавиту в Python - comments

En
сортировка по алфавиту python (python)