Каков наилучший способ создания списка, отсортированного по алфавиту, в Python?
Основной ответ:
mylist = ["b", "C", "A"]
mylist.sort()
Это модифицирует ваш исходный список (т.е. сортирует на месте). Чтобы получить отсортированную копию списка, не изменяя оригинал, используйте функцию sorted()
:
for x in sorted(mylist):
print x
Однако приведенные примеры немного наивны, поскольку не учитывают локаль и выполняют сортировку с учетом регистра. Вы можете воспользоваться опциональным параметром key
, чтобы задать собственный порядок сортировки (альтернатива, использование cmp
, является устаревшим решением, так как его приходится оценивать несколько раз - key
вычисляется только один раз для каждого элемента).
Итак, для сортировки в соответствии с текущей локалью с учетом правил, специфичных для данного языка (cmp_to_key
- вспомогательная функция из functools):
sorted(mylist, key=cmp_to_key(locale.strcoll))
И, наконец, если нужно, вы можете указать custom locale для сортировки:
import locale
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # vary depending on your lang/locale
assert 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] функция:
for x in sorted(list):
print x
Это возвращает новый отсортированный вариант списка, не изменяя исходный список.
[1]: https://docs.python.org/3/library/functions.html#sorted на "сортировка"и
Как правильно сортировать строки-это:
import locale
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # vary depending on your lang/locale
assert 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.сортировки(ключ=лямбда х: х.ниже ()) будет работать нормально для ASCII-только контексты.
Но как он справляется с правилами сортировки по языковому признаку? Учитывает ли он локаль?
Нет, list.sort()
- это общая функция сортировки. Если вы хотите сортировать в соответствии с правилами Unicode, вам придется определить пользовательскую функцию ключа сортировки. Вы можете попробовать использовать модуль pyuca, но я не знаю, насколько он полный.
Пожалуйста, используйте отсортированный (функций) в Питон3
items = ["love", "like", "play", "cool", "my"]
sorted(items2)
Предположим, что с = с "ZWzaAd"` в
Чтобы отсортировать строки выше простого решения будет ниже.
print ''.join(sorted(s))
или, может быть:
names = ['Jasmine', 'Alberto', 'Ross', 'dig-dog']
print ("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))
Старый вопрос, но если вы хотите сделать локали сортировка без установки язык.Значение lc_all
вы можете сделать это с помощью библиотека PyICU, как полагают этот ответ:
``питон импорт ОИТ # PyICU
деф sorted_strings(строки, локаль=нет): если локали нет: возвращает отсортированный(строк) подборочная машина = ОИТ.Сортировально-подборочной машины.метод createinstance(ОИТ.Локаль(локаль)) возвращает отсортированный(строки, ключ=сортировально-подборочной машины.getSortKey) ``
Затем звонок с например:
питон new_list = sorted_strings(list_of_strings, что "в ru_RU.в utf8 и")
Этот работал для меня без установки какого-либо действия или изменения других параметров системы.
(Это уже было предложено в комментарии aboveно я хотел дать ему больше внимания, потому что я пропустил это на себе в первую очередь).