После некоторых первых тестов кажется, что Python использует тот же порядок сортировки, что и сортировка Linux (сортировка gnu), с порядком сортировки C (если для локали установлено значение «C»).
Однако я хотел бы иметь возможность писать код Python, который сортирует и сравнивает так же, как сортировка gnu, в зависимости от локали.
Небольшой пример кода для иллюстрации проблемы:
import os
import subprocess
words = [
"Abd",
"éfg",
"aBd",
"aBd",
"zzz",
"ZZZ",
"efg",
"abd",
"fff",
]
with open("tosort", "w") as fout:
for word in words:
fout.write(word + "\n")
os.environ["LC_ALL"] = "en_US.UTF-8"
proc = subprocess.Popen(["sort", "tosort"], stdout=subprocess.PIPE)
sort_en_utf = proc.stdout.read().decode('utf-8').split()
os.environ["LC_ALL"] = "C"
proc = subprocess.Popen(["sort", "tosort"], stdout=subprocess.PIPE)
sort_c = proc.stdout.read().decode('utf-8').split()
os.environ["LC_ALL"] = "en_US.UTF-8"
sort_py = sorted(words)
for row in zip(sort_en_utf, sort_c, sort_py):
print(" ".join(row))
Если приведенный выше код запущен, я получаю следующий вывод:
abd Abd Abd
aBd ZZZ ZZZ
aBd aBd aBd
Abd aBd aBd
efg abd abd
éfg efg efg
fff fff fff
zzz zzz zzz
ZZZ éfg éfg
столбец 1 - это порядок сортировки/сравнения, который я хотел бы иметь в своем коде python, если локаль "en_US.UTF-8", столбцы 2 и 3 показывают, что python сортирует так же, как сортировка linux, если локаль установить на «С».
Поэтому я также хотел бы знать, есть ли способ:
"éfg" < "fff"
дает Истинно. Я не настаиваю на операторе сравнения, я также могу вызвать функцию. но результат заказа должен учитывать текущую локаль.
"a2" < "a10"
, поэтому он будет вести себя не так, как сортировка без параметров, а как локаль с UTF. - person gelonida   schedule 02.10.2019