Найти - Пользователи
Полная версия: Отсортировать список строк. Особенности национального алфавита.
Начало » Python для новичков » Отсортировать список строк. Особенности национального алфавита.
1 2
Alex.Pro.
Приветствую всех.
Кто-нибудь знает простой и красивый способ отсортировать список строк по алфавиту? К примеру, такой список животных:
“Аист”, “Баран”, “Волк”, “Ёж”, “ёжик”, “хорёк”, “черепаха”, “эму”, “ящерица”
vic57
можно свою последовательность задать
 >>> l=['Аист', 'Баран', 'Волк', 'Ёж', 'ёжик', 'хорёк', 'черепаха', 'эму', 'ящерица']
>>> rus_upper = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'
>>> sorted(l,key = lambda x: rus_upper.index(x[0].upper()))
['Аист', 'Баран', 'Волк', 'Ёж', 'ёжик', 'хорёк', 'черепаха', 'эму', 'ящерица']
>>> 
py.user.next
vic57
 sorted(l,key = lambda x: rus_upper.index(x[0].upper()))
  
>>> 'калёное' < 'кальян'
False
>>>
py.user.next
Alex.Pro.
Кто-нибудь знает простой и красивый способ
Задай весь свой алфавит, определив на нём строгий порядок. Потом по этому алфавиту сортируй строки по каждому символу.

Вообще, во всех языках используются средства для работы с локалью. Но в своих программах чаще всего можно вводить свою сортировку, которая просто правильно сортирует.
vic57
py.user.next
>>> ‘калёное’ < ‘кальян’
False
>>>
ну да, сортируется по первой букве, дальше надо много пилить рекурсию делать
я читал что вся проблема в букве Ё, костыль где-то видел
 def o_ord(ch):
    if ch == 'ё': return ord('е') + .5
    if ch == 'Ё': return ord('Е') + .5
    return ord(ch)
vic57
пилить оказалось немного
 def oord(ch):
    if ch == 'ё': return ord('е') + 0.5
    if ch == 'Ё': return ord('Е') + 0.5
    return ord(ch)
l = [
'хорёк','Аист','Ёж', 'ёжик',
'куча','кальян','к','калёное',
'Баран', 'Волк','коллайдер',
'коллаген','черепаха', 'эму', 'ящерица'
]
l.sort(key = lambda x: list(map(oord,x)))
print(l)
 ['Аист', 'Баран', 'Волк', 'Ёж', 'ёжик', 'к', 'калёное', 'кальян', 'коллаген', 'коллайдер', 'куча', 'хорёк', 'черепаха', 'эму', 'ящерица']
EleanorDouglas
Great post! If you're looking for fun while managing your finances, I recommend checking out the Slope Game. It's an engaging way to take a break and relax while still keeping your mind sharp. Balancing loans and leisure can be tricky, but little games like these can help!

py.user.next
vic57
я читал что вся проблема в букве Ё
Она сортирует в Юникоде. Как оно в Юникоде расположено, так оно и сортируется. Поэтому буквы в верхнем регистре идут первее букв в нижнем регистре. Это нужно не всегда, поэтому и лучше указать точный алфавит, в котором упорядочены все символы так, как это нужно для задачи. Тогда и можно на всю сортировку влиять.

Вот я тебе добавил Ящик - и всё сломалось
  
>>> def oord(ch):
...     if ch == 'ё': return ord('е') + 0.5
...     if ch == 'Ё': return ord('Е') + 0.5
...     return ord(ch)
... 
>>> l = [
...     'хорёк','Аист','Ёж', 'ёжик',
...     'куча','кальян','к','калёное',
...     'Баран', 'Волк','коллайдер',
...     'коллаген','черепаха', 'эму', 'Ящик',
...     'ящерица'
... ]
>>> 
>>> l.sort(key = lambda x: list(map(oord,x)))
>>> print(l)
['Аист', 'Баран', 'Волк', 'Ёж', 'Ящик', 'ёжик', 'к', 'калёное', 'кальян', 'коллаген', 'коллайдер', 'куча', 'хорёк', 'черепаха', 'эму', 'ящерица']
>>>
vic57
py.user.next
всё сломалось
ничего не сломалось - заглавные первыми идут. хочешь по другому - функцию перепиши
 def oord(ch):
    if ch == 'ё' or ch == 'Ё': return ord('е') + 0.5
    return ord(ch.lower())
Alex.Pro.
py.user.next
во всех языках используются средства для работы с локалью
А ю шурик?
py.user.next
Она сортирует в Юникоде. Как оно в Юникоде расположено, так оно и сортируется.
Вот именно. И локаль здесь ни причём.
Бедный русский язык! Несчастная буква “йО”! Всю жизнь, со времён появления IBM-compatible, буква “Ё” выпадает из алфавита и создаёт трудности при сортировке текстовых строк. Интересно, во времена БЭСМ какая кодировка использовалась? Там тоже буква “Ё” выпадала из алфавита? Хотя, в те времена счётные машины не занимались обработкой текстов.
vic57
пилить оказалось немного
Хороший костыль к методу .sort(). Мне нравится. Я у себя сделал примерно также, только сложнее. Потому что у меня алфавит шире: и буквы, и цифры, и некоторые знаки препинания.

Спасибо народу за обсуждение. Хорошо что в Пайтоне есть и метод .sort(), и функция sorted(). Жалко что они не адаптированы к русскому алфавиту. Будем пользоваться костылями.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB