Используйте localeи это методы сортировки строк для естественной сортировки в соответствии с текущей локалью.
u0b34a0f6ae
Ответы:
519
Основной ответ:
mylist =["b","C","A"]
mylist.sort()
Это изменяет ваш первоначальный список (т.е. сортирует на месте). Чтобы получить отсортированную копию списка, не меняя оригинал, используйте sorted()функцию:
for x in sorted(mylist):print x
Однако приведенные выше примеры немного наивны, поскольку они не учитывают языковой стандарт и выполняют сортировку с учетом регистра. Вы можете воспользоваться дополнительным параметром keyдля указания пользовательского порядка сортировки (альтернатива, использующая cmp, является устаревшим решением, так как его нужно оценивать несколько раз - keyвычисляется только один раз для элемента).
Итак, для сортировки в соответствии с текущей локалью, принимая во внимание языковые правила ( cmp_to_keyэто вспомогательная функция от functools):
import locale
locale.setlocale(locale.LC_ALL,'en_US.UTF-8')# vary depending on your lang/localeassert sorted((u'Ab', u'ad', u'aa'),
key=cmp_to_key(locale.strcoll))==[u'aa', u'Ab', u'ad']
Последнее замечание: вы увидите примеры сортировки без учета регистра, в которой используется lower()метод - это неверно, поскольку они работают только для подмножества символов ASCII. Эти два не подходят для любых неанглийских данных:
# this is incorrect!
mylist.sort(key=lambda x: x.lower())# alternative notation, a bit faster, but still wrong
mylist.sort(key=str.lower)
Хорошая точка зрения. Я оставлю свой текущий пример как есть, так как новичку, вероятно, легче увидеть, что происходит, но я буду помнить об этом в будущем.
Эли Кортрайт
1
Если кому-то интересно, производительность list.sort () можно посмотреть здесь
Хари Ганесан
1
@BornToCode: 1- я знаю . Посмотрите на ревизию (2008), на которую мой комментарий отвечает (мой комментарий о ненужном использовании лямбды). 2 - сортировка не-ASCII символов - большая отдельная тема. PyICU может быть использован вместо решения на основе локали.
Jfs
1
@Dmitry Это потому, что вы печатаете возвращаемое значение функции сортировки, вызываемой в [1, 2, 3].sort(). Так sort()как список сортируется на месте (т. Е. Изменяется непосредственно), он не возвращает отсортированный список и на самом деле ничего не возвращает, поэтому выводится ваш оператор print None. Если вы сохранили свой список в переменную, скажем x, вызвал x.sort(), то print(x)вы увидите отсортированный список.
import locale
locale.setlocale(locale.LC_ALL,'en_US.UTF-8')# vary depending on your lang/localeassert sorted((u'Ab', u'ad', u'aa'), cmp=locale.strcoll)==[u'aa', u'Ab', u'ad']# Without using locale.strcoll you get:assert sorted((u'Ab', u'ad', u'aa'))==[u'Ab', u'aa', u'ad']
Предыдущий пример mylist.sort(key=lambda x: x.lower())отлично подойдет для контекстов только ASCII.
Но как это обрабатывает языковые правила сортировки? Учитывает ли это язык?
Нет, list.sort()это общая функция сортировки. Если вы хотите выполнить сортировку в соответствии с правилами Unicode, вам нужно будет определить пользовательскую функцию ключа сортировки. Вы можете попробовать использовать модуль pyuca , но я не знаю, насколько он завершен.
Старый вопрос, но если вы хотите выполнить сортировкуlocale.LC_ALL с учетом локали без настройки, вы можете сделать это, используя библиотеку PyICU, как показано в этом ответе :
names =['Jasmine','Alberto','Ross','dig-dog']print("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))
locale
и это методы сортировки строк для естественной сортировки в соответствии с текущей локалью.Ответы:
Основной ответ:
Это изменяет ваш первоначальный список (т.е. сортирует на месте). Чтобы получить отсортированную копию списка, не меняя оригинал, используйте
sorted()
функцию:Однако приведенные выше примеры немного наивны, поскольку они не учитывают языковой стандарт и выполняют сортировку с учетом регистра. Вы можете воспользоваться дополнительным параметром
key
для указания пользовательского порядка сортировки (альтернатива, использующаяcmp
, является устаревшим решением, так как его нужно оценивать несколько раз -key
вычисляется только один раз для элемента).Итак, для сортировки в соответствии с текущей локалью, принимая во внимание языковые правила (
cmp_to_key
это вспомогательная функция от functools):И, наконец, если вам нужно, вы можете указать собственный языковой стандарт для сортировки:
Последнее замечание: вы увидите примеры сортировки без учета регистра, в которой используется
lower()
метод - это неверно, поскольку они работают только для подмножества символов ASCII. Эти два не подходят для любых неанглийских данных:источник
mylist.sort(key=str.lower)
быстрее.[1, 2, 3].sort()
. Такsort()
как список сортируется на месте (т. Е. Изменяется непосредственно), он не возвращает отсортированный список и на самом деле ничего не возвращает, поэтому выводится ваш оператор printNone
. Если вы сохранили свой список в переменную, скажемx
, вызвалx.sort()
, тоprint(x)
вы увидите отсортированный список.Также стоит отметить
sorted()
функцию:Это возвращает новую отсортированную версию списка без изменения исходного списка.
источник
Это действительно настолько просто :)
источник
Правильный способ сортировки строк:
Предыдущий пример
mylist.sort(key=lambda x: x.lower())
отлично подойдет для контекстов только ASCII.источник
Пожалуйста, используйте функцию sorted () в Python3
источник
Нет,
list.sort()
это общая функция сортировки. Если вы хотите выполнить сортировку в соответствии с правилами Unicode, вам нужно будет определить пользовательскую функцию ключа сортировки. Вы можете попробовать использовать модуль pyuca , но я не знаю, насколько он завершен.источник
Старый вопрос, но если вы хотите выполнить сортировку
locale.LC_ALL
с учетом локали без настройки, вы можете сделать это, используя библиотеку PyICU, как показано в этом ответе :Затем позвоните, например:
Это работало для меня без установки каких-либо локалей или изменения других настроек системы.
(Это уже было предложено в комментарии выше , но я хотел сделать его более заметным, потому что сначала я его пропустил.)
источник
предполагать
s = "ZWzaAd"
Чтобы отсортировать строку выше, простое решение будет ниже единицы.
источник
источник
Результат
источник
Это просто: https://trinket.io/library/trinkets/5db81676e4
Scores = Scores.split (',') для х в отсортированных (баллы): печать (х)
источник