Python中如何排序带有重音字符的字符串

4

可能是重复问题:
Python不正确地对Unicode进行排序。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是如何比较字符串的。我应该使用哪个比较函数来按字母顺序对单词进行排序?


看起来它运行正常。我看不到“z”。 - Jiří Polcar
这个例子中没有 z,但是 é 出现在 o 之后,这不是字母顺序。 - 0xced
我刚刚尝试了使用Python 2.6.1(这是Snow Leopard默认安装的版本),但它没有按预期排序。 - 0xced
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/locale.py中实现的strcoll只是简单地使用return cmp(a, b)。你的呢? - 0xced
@0xced:这是一个后备方案,如果无法导入“_locale”(这将是编译代码),至少在我的Linux系统上是这样。 - Thomas K
显示剩余3条评论
1个回答

2
我最终选择了去除变音符号并比较字符串的削减版本,这样我就不必添加PyICU依赖。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接