Вы хотите открыть файл в append-mode ('a'), rathen, чем write-mode ('w'); Документация Python объясняет различные доступные режимы.
Кроме того, вам может потребоваться использовать ключевое слово with:
. Хорошей практикой является используйте ключевое слово with при работе с файловыми объектами. Это имеет то преимущество, что файл правильно закрыт после завершения его набора, даже если на пути возникло исключение.
blockquote>>>> with open('/tmp/workfile', 'a') as f: ... f.write(your_input)
Основной ответ:
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)
list.sort()
Это действительно настолько просто:)
, Но как это обрабатывает язык определенные правила сортировки? Это принимает локаль во внимание?
нет, list.sort()
универсальная функция сортировки. Если Вы хотите отсортировать согласно правилам Unicode, необходимо будет определить пользовательскую функцию ключа сортировки. Можно попытаться использовать модуль pyuca , но я не знаю, насколько завершенный это.
Это также стоит отметить sorted()
функция:
for x in sorted(list):
print x
Это возвращает новую, отсортированную версию списка, не изменяя исходный список.
Старый вопрос, но если Вы хотите сделать осведомленная о локали сортировка без установки 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")
Это работало на меня, не устанавливая локалей или изменяя другие параметры настройки системы.
(Это было уже предложено в комментарии выше , но я хотел дать ему больше выдающегося положения, потому что я пропустил его сам сначала.)
Правильный способ сортировки строк:
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.