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

python string sorting

541551 просмотра

9 ответа

21069 Репутация автора

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

Автор: skolima Источник Размещён: 30.08.2008 05:03

Ответы (9)


35 плюса

7110 Репутация автора

list.sort()

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

Автор: rix0rrr Размещён: 30.08.2008 05:04

488 плюса

129649 Репутация автора

Решение

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

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)
Автор: Eli Courtwright Размещён: 30.08.2008 05:10

10 плюса

162936 Репутация автора

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

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

Автор: John Millikin Размещён: 30.08.2008 06:10

51 плюса

706096 Репутация автора

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

for x in sorted(list):
    print x

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

Автор: Greg Hewgill Размещён: 30.08.2008 10:14

18 плюса

372 Репутация автора

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

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 Размещён: 28.10.2009 10:45

0 плюса

759 Репутация автора

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

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

print ''.join(sorted(s))
Автор: JON Размещён: 12.05.2017 06:16

10 плюса

1012 Репутация автора

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

items = ["love", "like", "play", "cool", "my"]
sorted(items2)
Автор: Mahmud Ahsan Размещён: 27.12.2017 01:24

0 плюса

21 Репутация автора

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

names = ['Jasmine', 'Alberto', 'Ross', 'dig-dog']
print ("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))
Автор: Dragos Alexe Размещён: 13.08.2018 03:46

0 плюса

336 Репутация автора

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

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

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

Автор: vlz Размещён: 28.08.2019 12:39
Вопросы из категории :
32x32