Алфавитная сортировка в 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)
['ель', 'ёлка', 'жираф', 'заяц']
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!']