#45391: python 利用 str.maketrans 與需要注意的特殊條件 - 『科技始終來自於惰性』


sam851015@gmail.com (多挖鼻孔有益身心健康)

學校 : 臺中市立惠文高級中學
編號 : 277705
來源 : [123.192.228.253]
最後登入時間 :
2025-03-11 12:39:29
j010. 11946 - Code Number -- UVA | From: [123.192.228.253] | 發表日期 : 2025-02-24 12:34

這題目只要做字串轉換就好,但字典不是放在測資裡,而是放題目敘述裡,就是那兩個字串。

你固然可以靠人力一個一個去填,把內容一個一個的轉換目標字符,但這也太痛苦了,你得用肉眼一個一個去比較,還可能出錯,不建議你這麼搞。

你懶不懶我不知道,但我是很懶惰的,python 也知道有人很懶惰,於是 maketrans 誕生了。

 

要使用 maketrans ,直接使用 str.maketrans() 就能使用

它接受兩個相同長度的字串 a, b,並建立一個對照表,用來把 a 轉換成 b

例如這樣:

a = 'abcdef'
b = '123456'

trans_table = str.maketrans(a, b)

 

簡單吧~

注意字串長度必須要一樣長就可以了

我們只需要將題目提供的兩組字串,複製、貼上,丟進去餵給它就可以

 

然後再利用另一個方法: str.translate()

讓需要翻譯的字串調用這個方法,並傳入剛剛建立的對照表,就可以得到正解了。

像這樣

a = 'abcdef'
b = '123456'

trans_table = str.maketrans(a, b)

c = 'apple'
d = c.translate(trans_table)
print(d)    # "1ppl5"

 

什麼是優雅?這就是!

當別人還在出賣勞力,用肉眼一一比較時,你只需要複製貼上就可以建好對照表了。

 

--

 

然而這題有一個小坑,題目提供的字典是有瑕疵的,需要抓出來特判

 

5 應轉換成 S

2 應轉換成 Z

 

所以我們需要針對此處修改一下我們的對照表,怎麼改呢?

其實 str.maketrans() 回傳的東西本質上就是 dict,所以 dict 所有的語法都能用在它上面

需要注意的是裡面保存的格式不能是字串,而是 unicode 編碼,修改時需要特別注意這點

a = 'abcdef'
b = '123456'

trans_table = str.maketrans(a, b)

trans_table[ord("a")] = ord('9')

c = 'apple'
d = c.translate(trans_table)

print(d)    # "9ppl5"

 

我用紅字標示的那一行就是修改的辦法

借助 ord() 轉換字串,就能用人類的語言輕鬆調整字典的內容了

當然,如果你會 ascii 編碼,你也可以直接填入數字。

 

 
ZeroJudge Forum