Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 22, 2024 00:42:15

Alex.Pro.
От: Марик
Зарегистрирован: 2024-11-13
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

Отсортировать список строк. Особенности национального алфавита.

Приветствую всех.
Кто-нибудь знает простой и красивый способ отсортировать список строк по алфавиту? К примеру, такой список животных:

“Аист”, “Баран”, “Волк”, “Ёж”, “ёжик”, “хорёк”, “черепаха”, “эму”, “ящерица”

Офлайн

#2 Дек. 22, 2024 09:57:25

vic57
Зарегистрирован: 2015-07-07
Сообщения: 908
Репутация: +  127  -
Профиль   Отправить e-mail  

Отсортировать список строк. Особенности национального алфавита.

можно свою последовательность задать

 >>> l=['Аист', 'Баран', 'Волк', 'Ёж', 'ёжик', 'хорёк', 'черепаха', 'эму', 'ящерица']
>>> rus_upper = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'
>>> sorted(l,key = lambda x: rus_upper.index(x[0].upper()))
['Аист', 'Баран', 'Волк', 'Ёж', 'ёжик', 'хорёк', 'черепаха', 'эму', 'ящерица']
>>> 

Офлайн

#3 Дек. 22, 2024 19:04:08

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Отсортировать список строк. Особенности национального алфавита.

vic57
 sorted(l,key = lambda x: rus_upper.index(x[0].upper()))
  
>>> 'калёное' < 'кальян'
False
>>>



Офлайн

#4 Дек. 22, 2024 19:11:37

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Отсортировать список строк. Особенности национального алфавита.

Alex.Pro.
Кто-нибудь знает простой и красивый способ
Задай весь свой алфавит, определив на нём строгий порядок. Потом по этому алфавиту сортируй строки по каждому символу.

Вообще, во всех языках используются средства для работы с локалью. Но в своих программах чаще всего можно вводить свою сортировку, которая просто правильно сортирует.



Офлайн

#5 Дек. 22, 2024 20:31:42

vic57
Зарегистрирован: 2015-07-07
Сообщения: 908
Репутация: +  127  -
Профиль   Отправить e-mail  

Отсортировать список строк. Особенности национального алфавита.

py.user.next
>>> ‘калёное’ < ‘кальян’
False
>>>
ну да, сортируется по первой букве, дальше надо много пилить рекурсию делать
я читал что вся проблема в букве Ё, костыль где-то видел
 def o_ord(ch):
    if ch == 'ё': return ord('е') + .5
    if ch == 'Ё': return ord('Е') + .5
    return ord(ch)

Офлайн

#6 Дек. 23, 2024 08:20:30

vic57
Зарегистрирован: 2015-07-07
Сообщения: 908
Репутация: +  127  -
Профиль   Отправить e-mail  

Отсортировать список строк. Особенности национального алфавита.

пилить оказалось немного

 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)
 ['Аист', 'Баран', 'Волк', 'Ёж', 'ёжик', 'к', 'калёное', 'кальян', 'коллаген', 'коллайдер', 'куча', 'хорёк', 'черепаха', 'эму', 'ящерица']

Офлайн

#7 Дек. 24, 2024 05:01:24

EleanorDouglas
Зарегистрирован: 2024-12-24
Сообщения: 1
Репутация: +  -1  -
Профиль   Отправить e-mail  

Отсортировать список строк. Особенности национального алфавита.

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!

Офлайн

#8 Дек. 24, 2024 11:20:27

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Отсортировать список строк. Особенности национального алфавита.

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)
['Аист', 'Баран', 'Волк', 'Ёж', 'Ящик', 'ёжик', 'к', 'калёное', 'кальян', 'коллаген', 'коллайдер', 'куча', 'хорёк', 'черепаха', 'эму', 'ящерица']
>>>



Отредактировано py.user.next (Дек. 24, 2024 11:21:03)

Офлайн

#9 Дек. 24, 2024 13:38:42

vic57
Зарегистрирован: 2015-07-07
Сообщения: 908
Репутация: +  127  -
Профиль   Отправить e-mail  

Отсортировать список строк. Особенности национального алфавита.

py.user.next
всё сломалось
ничего не сломалось - заглавные первыми идут. хочешь по другому - функцию перепиши
 def oord(ch):
    if ch == 'ё' or ch == 'Ё': return ord('е') + 0.5
    return ord(ch.lower())

Офлайн

#10 Дек. 24, 2024 14:34:54

Alex.Pro.
От: Марик
Зарегистрирован: 2024-11-13
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

Отсортировать список строк. Особенности национального алфавита.

py.user.next
во всех языках используются средства для работы с локалью
А ю шурик?
py.user.next
Она сортирует в Юникоде. Как оно в Юникоде расположено, так оно и сортируется.
Вот именно. И локаль здесь ни причём.
Бедный русский язык! Несчастная буква “йО”! Всю жизнь, со времён появления IBM-compatible, буква “Ё” выпадает из алфавита и создаёт трудности при сортировке текстовых строк. Интересно, во времена БЭСМ какая кодировка использовалась? Там тоже буква “Ё” выпадала из алфавита? Хотя, в те времена счётные машины не занимались обработкой текстов.
vic57
пилить оказалось немного
Хороший костыль к методу .sort(). Мне нравится. Я у себя сделал примерно также, только сложнее. Потому что у меня алфавит шире: и буквы, и цифры, и некоторые знаки препинания.

Спасибо народу за обсуждение. Хорошо что в Пайтоне есть и метод .sort(), и функция sorted(). Жалко что они не адаптированы к русскому алфавиту. Будем пользоваться костылями.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version