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

Вы хотите открыть файл в append-mode ('a'), rathen, чем write-mode ('w'); Документация Python объясняет различные доступные режимы.

Кроме того, вам может потребоваться использовать ключевое слово with:

. Хорошей практикой является используйте ключевое слово with при работе с файловыми объектами. Это имеет то преимущество, что файл правильно закрыт после завершения его набора, даже если на пути возникло исключение.

blockquote>
>>> with open('/tmp/workfile', 'a') as f:
...     f.write(your_input)

387
задан martineau 25 April 2017 в 19:27
поделиться

6 ответов

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

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)
488
ответ дан skolima 25 April 2017 в 19:27
поделиться
list.sort()

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

35
ответ дан rix0rrr 25 April 2017 в 19:27
поделиться

, Но как это обрабатывает язык определенные правила сортировки? Это принимает локаль во внимание?

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

10
ответ дан John Millikin 25 April 2017 в 19:27
поделиться

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

for x in sorted(list):
    print x

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

51
ответ дан PrasadK 25 April 2017 в 19:27
поделиться

Старый вопрос, но если Вы хотите сделать осведомленная о локали сортировка без установки 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
ответ дан 22 November 2019 в 23:43
поделиться

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

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.

18
ответ дан 22 November 2019 в 23:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: