有没有按非英文字母排序的标准方法?例如,罗马尼亚字母表是“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 ...” [重复]的主要内容,如果未能解决你的问题,请参考以下文章