python-3.x - 如何在 python 3 中按本地语言排序拉丁语?
问题描述
在很多情况下,用户的语言不是“拉丁”脚本(例如:希腊语、俄语、中文)。在大多数情况下,排序是由
- 首先对特殊字符和数字进行排序(虽然是本地语言中的数字......),
- 其次是当地语言文字中的单词
- 最后,一般 utf 排序规则中的任何非本地字符,例如法语、英语或德语“导入”单词。
或者更具体的其余部分......:
是否可以根据脚本选择排序?
示例1:首先是中文脚本,然后是拉丁语-希腊语-阿拉伯语(甚至更多......)
示例 2:首先是希腊文,然后是拉丁文-阿拉伯文-中文(甚至更多......)
创建类似这些的最有效和最pythonic的方法是什么?(“任何”我的意思是简单的“选定的脚本优先”和 unicode 排序中的其余部分,或者更复杂的“选定的脚本优先”,然后是其余脚本的指定顺序)
解决方案
有趣的问题。这是一些根据第一个字符的书写系统对字符串进行分类的示例代码。
import unicodedata
words = ["Japanese", # English
"Nihongo", # Japanese, rōmaji
"にほんご", # Japanese, hiragana
"ニホンゴ", # Japanese, katakana
"日本語", # Japanese, kanji
"Японский язык", # Russian
"जापानी भाषा" # Hindi (Devanagari)
]
def wskey(s):
"""Return a sort key that is a tuple (n, s), where n is an int based
on the writing system of the first character, and s is the passed
string. Writing systems not addressed (Devanagari, in this example)
go at the end."""
sort_order = {
# We leave gaps to make later insertions easy
'CJK' : 100,
'HIRAGANA' : 200,
'KATAKANA' : 200, # hiragana and katakana at same level
'CYRILLIC' : 300,
'LATIN' : 400
}
name = unicodedata.name(s[0], "UNKNOWN")
first = name.split()[0]
n = sort_order.get(first, 999999);
return (n, s)
words.sort(key=wskey)
for s in words:
print(s)
在此示例中,我将平假名和片假名(两个日本音节)排序在同一级别,这意味着纯片假名字符串将始终排在纯平假名字符串之后。如果我们想对它们进行排序,使相同的音节(例如,に 和 ニ)排列在一起,那就更棘手了。
推荐阅读
- amazon-ec2 - 在 EC2 中部署 Ember JS 应用程序
- javascript - 如果匹配特定单词,Javascript大写前x个字符?
- java - 为什么在 SocketIO 上轮询得到数据“无法加载请求的项目”?
- linux - 用于从变量更新 pom 文件的 Shell 命令
- foreach - Yii2 使用 foreach 生成 3 列表
- java - Maven 无法从中央存储库下载依赖项
- python - 在 Linux 服务器 Centos 上安装 Python ODBC (pyodbc) 失败
- java - 无法为 JLabel 设置垂直文本位置?
- php - 这是不是一个数组?
- delphi - 如何使用delphi从json中获取值