hep*_*ram 7 python unicode internationalization palindrome hebrew
我正在为回文求解器编写一系列测试.我在希伯来语中遇到了有趣的回文:
טעםלפתתפלמעט
这是一个回文,但字母Mem有一个常规形式(מ)和一个"最终形式"(ם),它如何显示为单词中的最后一个字母.但是在我的程序中没有硬编码"0x5de => 0x5dd",我无法找到一种方法来以编程方式依赖Unicode,Python或将两者视为相同的库.我尝试过的事情:
s = '??? ??? ??? ???'
s.casefold() # Python 3.4
s.lower()
s.upper()
import unicodedata
unicodedata.normalize(...) # In case this functioned like a German Eszett
Run Code Online (Sandbox Code Playgroud)
所有人都产生了相同的字符串.其他会导致这个问题的希伯来字母(如果有人稍后搜索)将是Kaf,Nun,Peh和Tsadeh.不,我不是希伯来语的母语.
这是一个适用于您当前问题的丑陋解决方案:
import unicodedata
def make_map(ss):
return [unicodedata.name(s).split(' ')[-1] for s in ss]
def is_palindrome(ss):
return make_map(ss) == make_map(reversed(ss))
Run Code Online (Sandbox Code Playgroud)
不过,这依赖于 Python 查找表中希伯来语字符名称的格式,因此它可能无法完美概括。
具体来说,您有:
In [29]: unicodedata.name(s[2])
Out[29]: 'HEBREW LETTER FINAL MEM'
...
In [31]: unicodedata.name(s[-3])
Out[31]: 'HEBREW LETTER MEM'
Run Code Online (Sandbox Code Playgroud)
因此,除去最后一个词之外的所有内容,您将得到:
In [35]: [unicodedata.name(s_).split(" ")[-1] for s_ in s]
Out[35]: ['TET', 'AYIN', 'MEM', 'SPACE', 'LAMED', 'PE', 'TAV', 'SPACE', 'TAV', 'PE', 'LAMED', 'SPACE', 'MEM', 'AYIN', 'TET']
Run Code Online (Sandbox Code Playgroud)
反之亦然。不过,Unicode 是一个很大的世界,所以我不确定您是否无法构建一个击败它的示例。