Сортировка словаря по ключу с использованием локали/сортировки
Следующий код игнорирует локаль, и Égypt идет в конце, что не так?
dict = {"United States": "United States", "Spain" : "Spain", "England": "England", "Égypt": "Égypt"}
import locale
# using your default locale (user settings)
locale.setlocale(locale.LC_ALL,"fr_FR")
print OrderedDict(sorted(dict.items(), key=lambda t: t[0], cmp=locale.strcoll))
Это результат:
OrderedDict([('England', 'England'), ('Spain', 'Spain'), ('United States', 'United States'), ('\xc3\x89gypt', '\xc3\x89gypt')])
Ответы
Ответ 1
Рассмотрим следующее...
import unicodedata
from collections import OrderedDict
dict = {"United States": "United States", "Spain" : "Spain", "England": "England", "Égypt": "Égypt"}
import locale
# using your default locale (user settings)
locale.setlocale(locale.LC_ALL,"fr_FR")
print OrderedDict(sorted(dict.items(),cmp= lambda a,b: locale.strcoll(unicodedata.normalize('NFD', unicode(a)[0]).encode('ASCII', 'ignore'),
unicodedata.normalize('NFD', unicode(b)[0]).encode('ASCII', 'ignore'))))
Ответ 2
Здесь обход.
Использовать форму нормировки юникода каноническое разложение http://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms
# utf-8 <-> unicode is left as exercise to the reader
egypt = unicodedata.normalize("NFD", egypt)
sorted(['Egypt', 'E\xcc\x81gypt', 'US'])
['Egypt', 'E\xcc\x81gypt', 'US']
Это не учитывает языковой стандарт.
Помимо этого, попробуйте новый Python (да, я знаю) или библиотеку ICU из связанного с Martijn вопроса и соответствующих ответов.