Является ли функция сортировки Python такой же, как сортировка Linux с LC_ALL = C - PullRequest
7 голосов
/ 08 января 2012

Я портирую скрипт Bash на Python. Сценарий устанавливает LC_ALL=C и использует команду сортировки Linux, чтобы обеспечить собственный порядок байтов вместо порядка сортировки, зависящего от локали (/22722/pochemu-sortirovka-ne-sortiruet-odinakovo-na-kazhdoi-mashine).

В Python я хочу использовать список функций Python sort() или sorted() (без опции key=). Буду ли я всегда получать те же результаты, что и сортировка Linux с LC_ALL=C?

Ответы [ 4 ]

8 голосов
/ 08 января 2012

Сортировка должна вести себя так, как вы ожидаете, если вы передаете locale.strcoll в качестве аргумента cmp list.sort () и sorted () :

import locale
locale.setlocale(locale.LC_ALL, "C")
yourList.sort(cmp=locale.strcoll)
1 голос
/ 08 января 2012

Я использовал Международные компоненты для Unicode вместе с привязками PyICU , чтобы сортировать вещи с помощью sorted () и использовать мою собственную локаль (каталонский в моем случае).Например, упорядочение списка пользовательских профилей по имени свойства:

collator = PyICU.Collator.createInstance(PyICU.Locale('ca_ES.UTF-8'))
sorted(user_profiles, key=lambda x: x.name, cmp=collator.compare)
1 голос
/ 08 января 2012

Не-юникодные строки в версии Python меньше 3 на самом деле являются байтами.Функция сортировки и методы ничего не делают для обеспечения языкового стандарта (для явного упрощения сортировки с учетом языка требуется функция модуля языкового стандарта).

Юникодные строки и все строки Python 3.x больше не являются байтами.В Python 3 есть тип "bytes".

1 голос
/ 08 января 2012

Учитывая, что вы можете добавить функцию сравнения, вы можете убедиться, что сортировка будет эквивалентна LC_ALL = C. Из документов, однако, похоже, что если все символы 7-битные, то по умолчанию сортируется таким образом, в противном случае используется сортировка, специфичная для локали.

В случае, если у вас 8-битные символы или символы Unicode, сортировка по конкретному языку имеет большой смысл.

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