Кто-нибудь знает простой и красивый способ отсортировать список строк по алфавиту? К примеру, такой список животных:
“Аист”, “Баран”, “Волк”, “Ёж”, “ёжик”, “хорёк”, “черепаха”, “эму”, “ящерица”
“Аист”, “Баран”, “Волк”, “Ёж”, “ёжик”, “хорёк”, “черепаха”, “эму”, “ящерица”
>>> l=['Аист', 'Баран', 'Волк', 'Ёж', 'ёжик', 'хорёк', 'черепаха', 'эму', 'ящерица'] >>> rus_upper = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ' >>> sorted(l,key = lambda x: rus_upper.index(x[0].upper())) ['Аист', 'Баран', 'Волк', 'Ёж', 'ёжик', 'хорёк', 'черепаха', 'эму', 'ящерица'] >>>
vic57sorted(l,key = lambda x: rus_upper.index(x[0].upper()))
>>> 'калёное' < 'кальян' False >>>
Alex.Pro.Задай весь свой алфавит, определив на нём строгий порядок. Потом по этому алфавиту сортируй строки по каждому символу.
Кто-нибудь знает простой и красивый способ
py.user.nextну да, сортируется по первой букве, дальше надо
>>> ‘калёное’ < ‘кальян’
False
>>>
def o_ord(ch): if ch == 'ё': return ord('е') + .5 if ch == 'Ё': return ord('Е') + .5 return ord(ch)
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Она сортирует в Юникоде. Как оно в Юникоде расположено, так оно и сортируется. Поэтому буквы в верхнем регистре идут первее букв в нижнем регистре. Это нужно не всегда, поэтому и лучше указать точный алфавит, в котором упорядочены все символы так, как это нужно для задачи. Тогда и можно на всю сортировку влиять.
я читал что вся проблема в букве Ё
>>> 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ничего не сломалось - заглавные первыми идут. хочешь по другому - функцию перепиши
всё сломалось
def oord(ch): if ch == 'ё' or ch == 'Ё': return ord('е') + 0.5 return ord(ch.lower())
py.user.nextА ю шурик?
во всех языках используются средства для работы с локалью
py.user.nextВот именно. И локаль здесь ни причём.
Она сортирует в Юникоде. Как оно в Юникоде расположено, так оно и сортируется.
vic57Хороший костыль к методу .sort(). Мне нравится. Я у себя сделал примерно также, только сложнее. Потому что у меня алфавит шире: и буквы, и цифры, и некоторые знаки препинания.
пилить оказалось немного