有没有标准方法对非英语字母表排序?例如,罗马尼亚字母表是 "a ă â b c...

5 投票
2 回答
5798 浏览
提问于 2025-04-16 17:56

可能重复的问题:
在Python中如何按字母顺序排序Unicode字符串?

作为一个来自世界其他地方的人,我真的很烦恼,电脑默认并没有适应国际化的问题。很多网站仍然不使用Unicode,而PHP还停留在黑暗时代。

每当我想要按字母顺序排序罗马尼亚语的单词或名字时,我总是得自己写函数,这些函数效率都不高。肯定有一些地区设置可以让排序函数遵循指定语言的字母顺序,对吧?

我主要对Python、Java和JavaScript感兴趣。

编辑:我在这里找到了Python的解决方案这里,正如Chris Morgan所指出的。

2 个回答

4

没有一种统一的排序算法适用于所有语言,因为不同的语言有各自特定的排序规则。

这还不止于此:即使在同一种语言中,排序算法也可能会根据用途的不同而有所变化(比如在德语中,字典的排序方式和电话簿的排序方式就稍有不同)。

这个话题被称为 排序规则。关于 排序序列 的维基百科文章也很相关。

似乎有一个项目叫 python-collate,它实现了适用于多种语言的正确排序规则。

8

在Python中,你可以使用sorted函数,并且可以加一个key参数。比如说,在土耳其语中,有一些特殊的字母,比如'ç'、'ı'、'ş'等等。如果我想按照这些字母来排序,我就可以用一个包含这些字母的字符串作为key,然后根据这个字符串来排序,就像这样:

>>> letters="abcçdefgğhıijklmnoöprsştuüvyz" #Turkish alphabet
>>> sorted("açobzöğge")
['a', 'b', 'e', 'g', 'o', 'z', 'ç', 'ö', 'ğ'] #Python's default
>>> sorted("açobzöğge", key=lambda i: letters.index(i))
['a', 'b', 'ç', 'e', 'g', 'ğ', 'o', 'ö', 'z'] #With key parameter

注意:在Python 3中,处理Unicode(即各种文字和符号)会更简单。

编辑:正如评论中所说,如果我们使用字典,这个过程会更高效:

>>> letters="abcçdefgğhıijklmnoöprsştuüvyz"
>>> d={i:letters.index(i) for i in letters}
>>> sorted("açobzöğge", key=d.get)
['a', 'b', 'ç', 'e', 'g', 'ğ', 'o', 'ö', 'z']

撰写回答