有没有按非英文字母排序的标准方法?例如,罗马尼亚字母表是“a â b c ...” [重复]

Posted

技术标签:

【中文标题】有没有按非英文字母排序的标准方法?例如,罗马尼亚字母表是“a â b c ...” [重复]【英文标题】:Is there a standard way to sort by a non-english alphabet? For example, the romanian alphabet is "a ă â b c..." [duplicate] 【发布时间】:2011-08-28 17:58:22 【问题描述】:

可能重复:How do I sort unicode strings alphabetically in Python?

作为世界其他地区的公民,我对计算机默认不适应处理国际问题这一事实感到非常恼火。许多网站仍然不使用 Unicode,php 仍处于黑暗时代。

当我想对罗马尼亚语中的单词或名称列表进行排序时,我总是必须编写自己的函数,这几乎没有效率。一定有一些区域设置可以让排序函数遵循指定语言的字母顺序,对吧?

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

编辑:正如 Chris Morgan 所指出的,我找到了 Python here 的答案。

【问题讨论】:

嗯,你不能获取UTF-8中的字节值并按照那个排序吗?我的意思是,大多数排序函数都遵循你给它们的比较器的顺序,你可以定义任何你喜欢的方式...... 没有。在 Unicode 中,'z' 位于 'ă' 之前。这就是重点。 我意识到重复只处理 Python,但也有 Java 的 ICU - 虽然没有 JavaScript 版本。 是的,你是对的,克里斯。我的搜索技能找不到那个。我找到了 Python 的答案:设置语言环境,然后设置 theList.sort(cmp = locale.strcoll)。 更糟糕的是,有时单独的字符不足以进行排序。例如,在匈牙利语中,单词“csiga”(蜗牛)出现在 “cukor”(糖)之后,而不是之前。为什么?因为“cs”被认为是一个字母,即使它用两个字形表示。 【参考方案1】:

在 Python 中,您始终可以使用带键参数的排序函数。例如,在土耳其语中,我们有 'ç'、'ı'、'ş' 等字母。如果我想根据该字母排序,我会使用对字母进行排序的键字符串,并根据排序字符串这个,像这样:

>>> 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 更容易。

编辑,正如cmets所说,如果我们使用字典,这个过程会更有效:

>>> 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']

【讨论】:

我认为这正是他所说的hardly efficient 我不认为它是那么低效。而且我认为没有更有效的代码(也许是一些小的调整)。 多次使用index比准备字典映射字母到整数效率低。 这是低效的,因为 letters.index(i) 查找是 O(n) - 这是在一个紧密的循环中调用的。您可能想先将它添加到字典中,然后像这样查找它。 谢谢,用字典编辑答案。【参考方案2】:

没有适用于所有语言的单一、统一的排序算法,因为许多语言都有非常具体的排序规则。

它甚至更进一步:即使在一种语言中,排序算法也会根据其用途而有所不同(例如,德语词典的排序与电话簿略有不同)。

整个话题被称为Collation。 Collating sequence 上的***文章也是相关的。

似乎有一个项目可以为多种语言实现正确的排序规则,名为python-collate。

【讨论】:

以上是关于有没有按非英文字母排序的标准方法?例如,罗马尼亚字母表是“a â b c ...” [重复]的主要内容,如果未能解决你的问题,请参考以下文章

PyYAML 可以按非字母顺序转储 dict 项目吗?

按非案例类的字段排序 PriorityQueue

微信通讯录ABCD是啥意思

字体设计:拉丁字母字体书写方法分类

如何在Vuejs For循环中使用字母或罗马数字作为索引?

django 按非相关表中的汇总值排序