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

417

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

skolima
источник
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

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

Грег Хьюгилл
источник
36
list.sort()

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

rix0rrr
источник
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.

schmichael
источник
13

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

items = ["love", "like", "play", "cool", "my"]
sorted(items2)
Махмуд Ахсан
источник
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))
JON
источник
это не список строк, которые вы здесь сортируете
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']

asing177
источник
0

Это просто: https://trinket.io/library/trinkets/5db81676e4

scores = '54 - Alice,35 - Bob,27 - Carol,27 - Chuck,05 - Craig,30 - Dan,27 - Erin,77 - Eve,14 - Fay,20 - Frank,48 - Grace,61 - Heidi,03 - Judy,28 - Mallory,05 - Olivia,44 - Oscar,34 - Peggy,30 - Sybil,82 - Trent,75 - Trudy,92 - Victor,37 - Walter'

Scores = Scores.split (',') для х в отсортированных (баллы): печать (х)

Хедаятулла Сарвари
источник