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


417

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


1
Используйте localeи это методы сортировки строк для естественной сортировки в соответствии с текущей локалью.
u0b34a0f6ae

Ответы:


519

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

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)

37
mylist.sort(key=str.lower)быстрее.
JFS

1
Хорошая точка зрения. Я оставлю свой текущий пример как есть, так как новичку, вероятно, легче увидеть, что происходит, но я буду помнить об этом в будущем.
Эли Кортрайт

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)вы увидите отсортированный список.
bjg222

56

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

for x in sorted(list):
    print x

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



18

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

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.



10

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

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


1

Старый вопрос, но если вы хотите выполнить сортировку 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")

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

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


0

предполагать s = "ZWzaAd"

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

print ''.join(sorted(s))

это не список строк, которые вы здесь сортируете
mnl

0

Или, может быть:

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

0
l =['abc' , 'cd' , 'xy' , 'ba' , 'dc']
l.sort()
print(l1)

Результат

['abc', 'ba', 'cd', 'dc', 'xy']


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.