2008-08-30 2 views
299

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

+1

Используйте `locale` и это строковых методов сортировки для сортировки естественно в зависимости от текущей локали. – u0b34a0f6ae 2009-09-08 18:21:41

ответ

384

Basic Ответ:

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

`mylist.sort (key = str.lower)` быстрее. – jfs 2008-10-27 21:30:44

32
list.sort() 

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

+2

Не работает на Python 3.6 с числами. Вместо этого используйте `sorted (list)`. – Dmitry 2017-10-28 21:01:40

10

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

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

41

Также стоит отметить 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-только контекстах.

1

Пусть s = "ZWzaAd"

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

print ''.join(sorted(s)) 
4

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

items = ["love", "like", "play", "cool", "my"] 
sorted(items2) 
Смежные вопросы