【Python CheckiO 题解】Remove Accents
CheckiO 是面向初學者和高級程序員的編碼游戲,使用 Python 和 JavaScript 解決棘手的挑戰和有趣的任務,從而提高你的編碼技能,本博客主要記錄自己用 Python 在闖關時的做題思路和實現代碼,同時也學習學習其他大神寫的代碼。
CheckiO 官網:https://checkio.org/
我的 CheckiO 主頁:https://py.checkio.org/user/TRHX/
CheckiO 題解系列專欄:https://itrhx.blog.csdn.net/category_9536424.html
CheckiO 所有題解源代碼:https://github.com/TRHX/Python-CheckiO-Exercise
題目描述
【Remove Accents】:給定一個 Unicode 字符串,去除其中的重音符號,é:帶重音的字母,e:不帶重音的字母,? :獨立的重音符號。
【鏈接】:https://py.checkio.org/mission/remove-accents/
【輸入】:字符串(Unicode)
【輸出】:無重音的 Unicode 字符串
【前提】:0≤|input|≤40
【范例】:
checkio(u"préfèrent") == u"preferent" checkio(u"loa?i tr?n l??n") == u"loai tran lon"解題思路
了解這些特殊字符,比如:Spicy Jalape?o 使用的是拉丁字母“n”緊跟著一個“~”組合而成的字符(U+0303),也就是 Spicy Jalapen\u0303o
利用 unicodedata 模塊,normalize() 方法將字符串進行分解,利用 combining() 方法對字符做檢查,判斷它是否為一個組合型字符(包含重音字符等特殊字符),如果不是組合型字符,則將其組成一個新的字符串。
知識擴展
unicodedata.normalize(form, unistr) 方法:
把一串 Unicode 字符串轉換為普通格式的字符串,具體格式(form)支持 NFC、NFKC、NFD 和 NFKD 格式。
一些文本元素既可以使用靜態的預先組合好的形式,也可使用動態組合的形式。Unicode 字符的不同表示序列被認為是等價的。如果兩個或多個序列被認為是等價的,Unicode 標準不規定哪一種特定的序列是正確的,而認為每一個序列只不過與其它序列等價。如果需要一種單一的表示方式,可以使用一種規范化的 Unicode 文本形式來減少不想要區別。Unicode 標準定義了四種規范化形式: Normalization Form D (NFD),Normalization Form KD (NFKD),Normalization Form C (NFC),和Normalization Form KC (NFKC)。
NFD 和 NFKD 將可能的字符進行分解,而 NFC 和 NFKC 將可能的字符進行組合。
unicodedata 模塊文檔:https://docs.python.org/zh-cn/3.7/library/unicodedata.html
以下舉例說明不同格式(form)的區別:
例(NFC):
import unicodedatain_string = u"préfèrent" for c in unicodedata.normalize('NFC', in_string):print(c)輸出結果
p r é f è r e n t例(NFD):
import unicodedatain_string = u"préfèrent" for c in unicodedata.normalize('NFD', in_string):print(c)輸出結果:
p r e ? f e ? r e n t代碼實現
import unicodedatadef checkio(in_string):# remove accentsreturn ''.join(i for i in unicodedata.normalize('NFD', in_string) if not unicodedata.combining(i))# These "asserts" using only for self-checking and not necessary for auto-testing if __name__ == '__main__':assert checkio(u"préfèrent") == u"preferent"assert checkio(u"loa?i tr?n l??n") == u"loai tran lon"print('Done')大神解答
大神解答 NO.1
from unicodedata import category, normalizedef checkio(string):return ''.join(c for c in normalize('NFKD', string) if category(c) != 'Mn')大神解答 NO.2
from unicodedata import normalize, combining as accent from functools import partial as curry from itertools import filterfalse as removeiftake_apart = curry(normalize, "NFD") remove_accents = curry(removeif, accent) make_str = ''.joindef compose(*funcs):def composition(x):for func in funcs:x = func(x)return xreturn compositioncheckio = compose(take_apart, remove_accents, make_str)大神解答 NO.3
from unicodedata import category as cat, name import redef checkio(s):return ''.join(eval("'{}'.{}er()".format( # evaluator*re.findall('LETTER (.?)', name(c)) or c, # "letters"'upp' if cat(c) == 'Lu' else 'low')) # letter casefor c in filter(lambda c: cat(c)[0] in 'PuZzLeS', s)) # letter generator大神解答 NO.4
from unicodedata import normalizedef checkio(s):return ''.join(c for c in normalize('NFD', s) if c not in u"????????????????????")總結
以上是生活随笔為你收集整理的【Python CheckiO 题解】Remove Accents的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宝马新一代X3首见
- 下一篇: Python3 爬虫学习笔记 C04 【