Сортировка списка строк в лексикографическом порядке

Я хочу напечатать слова в лексикографическом порядке. Я думал, что sorted() так расположил слова. Я также пробовал .sort(), который возвращает тот же порядок. Или я что-то упускаю с тем, что такое лексикографический порядок?

Код:

a_list = ['Zrhregegrydb', 'cygzRFWDWBdvF']
for word in sorted(a_list):
    print(word)

Выход:

# Zrhregegrydb
# cygzRFWDWBdvF

Желаемый результат:

# cygzRFWDWBdvF
# Zrhregegrydb

person Wizard    schedule 20.05.2018    source источник
comment
Вы хотите сортировать строчные буквы перед прописными или полностью игнорировать регистр?   -  person Aran-Fey    schedule 20.05.2018
comment
Лексикографический порядок и регистронезависимость кажутся независимыми, но на самом деле являются конфликтующими понятиями. Регистр букв зависит от региона/культуры. Как только вы попадете туда, вы потеряете понятие лексикографического порядка. Вы действительно хотите, чтобы порядок сортировки основывался на локали пользователя?   -  person Tom Blodget    schedule 21.05.2018


Ответы (5)


Это связано с тем, что значение ASCII для прописных букв меньше, чем для строчных. Если вы хотите, чтобы ваша сортировка игнорировала регистр, вы можете сделать это, например:

for word in sorted(a_list, key=str.lower):
person Tané Tachyon    schedule 20.05.2018
comment
Проблема здесь в том, что строчные и прописные буквы будут в произвольном порядке. Пример вывода: ['a', 'A', 'b', 'B'] или ['a', 'A', 'B', 'b'] (зависит от порядка ввода). - person C. Yduqoli; 12.07.2019

По умолчанию python уже сортирует строки в лексикографическом порядке, но все прописные буквы сортируются перед строчными. Если вы хотите сортировать строки и игнорировать регистр, вы можете сделать

b_list = sorted(a_list, key=str.lower)
person Code-Apprentice    schedule 20.05.2018
comment
указание str.lower напрямую в качестве ключа быстрее, чем вызов лямбды, которая вызывает str.lower. Еще лучше используйте str.casefold. - person PM 2Ring; 20.05.2018
comment
@ PM2Ring Хороший вопрос. Это также меньше печатать. - person Code-Apprentice; 20.05.2018

Вы что-то упускаете. В стандартном порядке Unicode (начиная со старого порядка ASCII) все заглавные английские буквы идут перед всеми строчными буквами. Вы можете увидеть это в таблице символов Unicode.

Если вы хотите игнорировать регистр при сортировке, как кажется, просто временно преобразуйте все буквы в верхний или нижний регистр во время сортировки. Python позволяет вам сделать это в функции sorted с параметром key, как вы можете видеть в других ответах здесь (завершено до того, как я закончил этот ответ).

person Rory Daulton    schedule 20.05.2018

Вы можете игнорировать регистр при сортировке:

sorted_list = sorted(a_list, key = lambda s : s.lower())
person Mureinik    schedule 20.05.2018

Вы должны повторять, используя индексы, чтобы увидеть правильный порядок.

Вот код, как вы можете это сделать.

a_list = ['Zrhregegrydb', 'cygzRFWDWBdvF']
a_list.sort(reverse=True)
for i in range(0, len(a_list)):
    print a_list[i]
person Usama Jamil    schedule 20.05.2018
comment
И цикл из ОП предпочтительнее, чем цикл по range(). - person Code-Apprentice; 20.05.2018
comment
Я сделал, и он работал отлично. Я проверил код, а затем, получив ответ, вы можете проверить еще раз. - person Usama Jamil; 20.05.2018
comment
repl.it/@codeguru/TriangularNutritiousLicenses Я получаю вывод как xyz сначала, затем abc, что в обратном порядке Алфавитный порядок. Это не желаемый результат ОП. - person Code-Apprentice; 20.05.2018
comment
Если вы хотите сначала abc, просто удалите reverse = True, и он выполнит работу, которую я предоставил код в соответствии с его требованием. - person Usama Jamil; 20.05.2018
comment
Да, ваш код работает для приведенного примера. Однако предлагаемое вами решение не работает для других возможных входных данных. Удаление reverse=True просто дает исходный код из вопроса, который также не является допустимым решением. - person Code-Apprentice; 20.05.2018