Почему не работает сортировка списка в Python?

Добрый день. Не получается отсортировать список пользователей.
Вроде всё делаю правильно, но сортировка не работает.
Вот код:
users = ["Андрей", "София", "Cветлана", "Валерий", "Илья", "Mаксим", "Дмитрий", "Лиза"]
users.sort()
print(users)
users.sort(key=str.lower)
print(users)

В обоих случаях выводит:
['Cветлана', 'Mаксим', 'Андрей', 'Валерий', 'Дмитрий', 'Илья', 'Лиза', 'София']
['Cветлана', 'Mаксим', 'Андрей', 'Валерий', 'Дмитрий', 'Илья', 'Лиза', 'София']
  • Вопрос задан
  • 1237 просмотров
Решения вопроса 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
5e3948e66cddf596697310.png
Есть похожие или даже одинаковые по начертанию, но совершенно разные по коду и порядку символы в юникоде.
Это часто вызывает проблемы.
Если вы точно знаете, что в ваших именах должны быть только русские буквы, то можете обработать строки заменяя похожие по начертанию символы. В таком виде, конечно, решение не пригодно в случае, если у вас попадётся имя полностью на английском.
Можно также проверять наличие непохожих по начертанию символов в имени, и если таковые есть, значит замены сделаны не по ошибке. Можно сделать автоматическую обратную подстановку, если в имени нет непохожих на английские русских букв.
В любом из этих случаев могут возникнуть ситуации некорректного трактования имени. К примеру к вам пришел "АВРААМ" и утверждает, что его родители большие затейники, русского не знают, к евреям отношения не имеют, а дома его называют "Абпаамом".
users = ["Андрей", "София", "Cветлана", "Валерий", "Илья", "Mаксим", "Дмитрий", "Лиза"]
trans_table = str.maketrans(
    'ABCEHKMOPTXacekmopuxy', 
    'АВСЕНКМОРТХасекмориху',
)
russian_letters_normalizer = lambda s: s.translate(trans_table) if isinstance(s, str) else s
print('Original:', users)
print('Sorted:  ', list(sorted(users, key=russian_letters_normalizer)))
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы