如何在Python 3中按本地语言对拉丁语进行排序?

问题描述 投票:0回答:2

在很多情况下,用户的语言不是“latin”脚本(示例包括:希腊语、俄语、中文)。在大多数情况下,排序是通过

完成的
  • 首先对特殊字符和数字进行排序(虽然是当地语言的数字......),
  • 其次是当地语言文字中的单词
  • 最后是任何非本地字符,例如法语、英语或德语“导入”单词,采用通用 utf 排序规则。

或者更具体地说明其余的...:

可以根据脚本选择排序吗?

示例1:首先是中文文字,然后是拉丁语-希腊语-阿拉伯语(甚至更多......)

示例2:首先是希腊字母,然后是拉丁-阿拉伯-中文(甚至更多......)

创建此类排序的最有效且Python式的方法是什么? (“any”我的意思是“简单”“首先选择的脚本”并按unicode排序,或者更复杂的“首先选择的脚本”,然后是其余脚本的指定顺序) 有趣的问题。这是一些对字符串进行分类的示例代码 根据第一个字符的书写系统。

python-3.x sorting
2个回答
2
投票

在此示例中,我对平假名和片假名(这两个日语 音节)处于同一级别,这意味着纯片假名字符串将 总是出现在纯平假名字符串之后。如果我们想对它们进行排序 相同的音节(例如,に和ni)排序在一起,那就是 更棘手。


一个老问题,但我想提供一种利用 PyICU 和 ICU4C 的替代方法。


0
投票

Unicode 对 BCP47 有两个扩展,允许控制或覆盖排序规则的各个方面。具体来说,

-u-kr-

允许在排序规则内重新排序脚本。您指定一个由连字符分隔的四个字母 ISO 15924 脚本代码列表。这将控制脚本顺序的排序。

使用 BCP-47 语言标签创建区域设置。在这种情况下,我将使用
und-u-kr-Adlm-Hans-Ethi-Latn

    und
  1. undefined
    ,它不代表特定的语言。它将使用根排序规则。我本可以使用
    en-u-kr-Adlm-Hans-Ethi-Latn
    ,因为 English 也使用根排序规则。
    
    langauge 标签指定排序 Adlam,然后是简体中文,然后是埃塞俄比亚文字,然后是拉丁文。所有其他脚本均按根排序规则中的顺序排序。
    
  2. import icu locale = icu.Locale.forLanguageTag('und-u-kr-Adlm-Hans-Ethi-Latn') collator = icu.Collator.createInstance(locale) languages = ['𞠗𞢱𞡓𞠣', 'नेपाली','ꛀꛣꚧꚳ','白语','ማርኛ','français', '𞤊𞤵𞥅𞤼𞤢 𞤔𞤢𞤤𞤮𞥅'] print(sorted(languages)) # ['français', 'नेपाली', 'ማርኛ', '白语', 'ꛀꛣꚧꚳ', '𞠗𞢱𞡓𞠣', '𞤊𞤵𞥅𞤼𞤢 𞤔𞤢𞤤𞤮𞥅'] print(sorted(languages, key=collator.getSortKey)) # ['𞤊𞤵𞥅𞤼𞤢 𞤔𞤢𞤤𞤮𞥅', '白语', 'ማርኛ', 'français', 'नेपाली', 'ꛀꛣꚧꚳ', '𞠗𞢱𞡓𞠣']

© www.soinside.com 2019 - 2024. All rights reserved.