Как отсортировать список строк? - PullRequest
373 голосов
/ 30 августа 2008

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

Ответы [ 8 ]

479 голосов
/ 30 августа 2008

Базовый ответ:

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)
50 голосов
/ 31 августа 2008

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

for x in sorted(list):
    print x

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

35 голосов
/ 30 августа 2008
list.sort()

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

18 голосов
/ 29 октября 2009

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

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 голосов
/ 30 августа 2008

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

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

9 голосов
/ 27 декабря 2017

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

items = ["love", "like", "play", "cool", "my"]
sorted(items2)
0 голосов
/ 13 августа 2018

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

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 голосов
/ 12 мая 2017

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

Для сортировки выше строки простое решение будет ниже единицы.

print ''.join(sorted(s))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...