Сортировка строк с акцентированными символами в python

Возможный дубликат:
Python не сортирует юникод правильно. Strcoll не помогает.

Я пытаюсь отсортировать некоторые слова в алфавитном порядке. Вот как я это делаю:

#!/opt/local/bin/python2.7
# -*- coding: utf-8 -*-

import locale

# Make sure the locale is in french
locale.setlocale(locale.LC_ALL, "fr_FR.UTF-8")
print "locale: " + str(locale.getlocale())

# The words are in alphabetical order
words = ["liche", "lichée", "lichen", "lichénoïde", "licher", "lichoter"]

for word in sorted(words, cmp=locale.strcoll):
    print word.decode("string-escape")

Я ожидаю, что слова будут напечатаны в том же порядке, в котором они определены, но вот что я получаю:

locale: ('fr_FR', 'UTF8')
liche
lichen
licher
lichoter
lichée
lichénoïde

Символ é обрабатывается так, как если бы он был больше z.

Кажется, я неправильно понимаю, как locale.strcoll сравнивает строки. Какую функцию сравнения следует использовать для сортировки слов по алфавиту?


person 0xced    schedule 10.12.2010    source источник
comment
Вроде работает правильно. Я не вижу З.   -  person Jiří Polcar    schedule 10.12.2010
comment
В этом примере нет z, но é идет после o, что не является алфавитным порядком.   -  person 0xced    schedule 10.12.2010
comment
И я также подтвердил, что он отлично работает в 2.7 здесь. Что-то не-Python не так.   -  person Ignacio Vazquez-Abrams    schedule 10.12.2010
comment
Я только что попробовал с python 2.6.1 (который является установкой Snow Leopard по умолчанию), и он не сортируется, как ожидалось.   -  person 0xced    schedule 10.12.2010
comment
Тогда проблема заключается в том, как Python взаимодействует с OS X, а не с самим Python.   -  person Ignacio Vazquez-Abrams    schedule 10.12.2010
comment
Реализация strcoll в /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/locale.py просто return cmp(a,b) Какая у вас?   -  person 0xced    schedule 10.12.2010
comment
@0xced: это запасной вариант, если он не может импортировать _locale (который будет скомпилирован кодом), по крайней мере, в моей системе Linux.   -  person Thomas K    schedule 10.12.2010
comment
Действительно, это также запасной вариант для Mac OS X. Так что теперь я понятия не имею, почему тогда strcoll не работает должным образом.   -  person 0xced    schedule 13.12.2010


Ответы (1)


В конце концов я решил удалить диакритические знаки и сравнить версию строк с удаленным кодом, чтобы мне не приходилось добавлять зависимость PyICU.

person 0xced    schedule 13.12.2010