首页 > 解决方案 > 如何在 python 3 中按本地语言排序拉丁语?

问题描述

在很多情况下,用户的语言不是“拉丁”脚本(例如:希腊语、俄语、中文)。在大多数情况下,排序是由

或者更具体的其余部分......:

是否可以根据脚本选择排序?

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

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

创建类似这些的最有效和最pythonic的方法是什么?(“任何”我的意思是简单的“选定的脚本优先”和 unicode 排序中的其余部分,或者更复杂的“选定的脚本优先”,然后是其余脚本的指定顺序)

标签: python-3.xsorting

解决方案


有趣的问题。这是一些根据第一个字符的书写系统对字符串进行分类的示例代码。

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)

在此示例中,我将平假名和片假名(两个日本音节)排序在同一级别,这意味着纯片假名字符串将始终排在纯平假名字符串之后。如果我们想对它们进行排序,使相同的音节(例如,に 和 ニ)排列在一起,那就更棘手了。


推荐阅读