Как отсортировать список строк?

Каков наилучший способ создания отсортированного по алфавиту списка в Python?

Ответ 1

Основной ответ:

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))

И, наконец, если вам нужно, вы можете указать пользовательскую локаль для сортировки:

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)

Ответ 2

Также стоит отметить функцию sorted() :

for x in sorted(list):
    print x

Возвращает новую отсортированную версию списка без изменения исходного списка.

Ответ 3

list.sort()

Это действительно так просто:)

Ответ 4

Правильный способ сортировки строк:

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.sort(key=lambda x: x.lower()) будет отлично работать для контекстов только для ASCII.

Ответ 5

Но как это относится к правилам сортировки конкретных языков? Учитывает ли он язык?

Нет, list.sort() - это общая функция сортировки. Если вы хотите сортировать в соответствии с правилами Unicode, вам нужно будет определить функцию пользовательского сортировочного ключа. Вы можете попробовать использовать pyuca, но я не знаю, насколько это полно.

Ответ 6

Пожалуйста, используйте функцию sorted() в Python3

items = ["love", "like", "play", "cool", "my"]
sorted(items2)

Ответ 7

Предположим, что s = "ZWzaAd"

Чтобы отсортировать строку выше, простое решение будет ниже единицы.

print ''.join(sorted(s))

Ответ 8

Or maybe:

names = ['Jasmine', 'Alberto', 'Ross', 'dig-dog']
print ("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))

Ответ 9

Старый вопрос, но если вы хотите выполнить сортировку с учетом региональных настроек без настройки locale.LC_ALL, вы можете сделать это, используя библиотеку PyICU, как предлагает этот ответ:

import icu # PyICU

def sorted_strings(strings, locale=None):
    if locale is None:
       return sorted(strings)
    collator = icu.Collator.createInstance(icu.Locale(locale))
    return sorted(strings, key=collator.getSortKey)

Затем позвоните, например, с помощью:

new_list = sorted_strings(list_of_strings, "de_DE.utf8")

Это сработало для меня без установки каких-либо локалей или изменения других настроек системы.

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