題目: 給定一個英文的字符串, 要求你將其中的元音刪除掉, 返回新的字符串.
例如:
"This website is for losers LOL!"? -->? "Ths wbst s fr lsrs LL!"
?
當看到這個題目的時候, 第一個想起的就是re模塊的正則表達式. 不過由于最近使用過字符串的replace方法, 所以我給出的解決方法是:
?
def disemvowel(string):remove_list = ["A", "a", "E", "e", "I", "i", "O", "o", "U", "u"] # 先列出元音列表for s in remove_list:while s in string:string = string.replace(s, "") # 將元音字符替換為空再重新賦值回去return string
?
這樣就可以不用使用re模塊就完成了要求. 但是, 還有人給出了更精妙的解決方案:
?
def disemvowel(s):return s.translate(None, "aeiouAEIOU")
?
還有許多其他的解決方案, 有興趣的可以訪問:
https://www.codewars.com/kata/disemvowel-trolls/solutions/python/all/best_practice
?
這里使用了一個字符串特別的方法, translate. 而這個方法平時我都沒怎么注意過, 下面是官方文檔的說明:
?
S.translate(table [,deletechars]) -> stringReturn a copy of the string S, where all characters occurring in the optional argument deletechars are removed, and the remaining characters have been mapped through the given translation table, which must be a string of length 256 or None. If the table argument is None, no translation is applied and the operation simply removes the characters in deletechars.
返回一個字符串的副本, 所以出現在可選參數deletechars中的字符將會被移除, 而剩余的的字符將會通過給定的轉化表進行映射替換, 這個表必須是長度256的字符串或者是None. 當為None時就不進行映射替換.
?
所以?s.translate(None, "aeiouAEIOU") 的意思就是刪除掉特定的字符了.
?
而關于映射表的使用, 一般要借用string模塊, 下面是一個示例:
?
from string import maketransin_str = "abc" out_str = "123" table = maketrans(in_str, out_str) raw_str = "abc def ghi" result = raw_str.translate(table, "ag") print result
結果:
按照方法的定義, 首先去除對應的字符, a和g在映射替換前其實已經被去掉了,? 所以在進行映射替換的時候, a是不存在的, 所以并沒有映射替換成1, 結果也就如上所示了.
?
中文意義如何?
?
#!/usr/bin/env python # coding: utf-8from string import maketransin_str = "好" out_str = "壞" table = maketrans(in_str, out_str) raw_str = "你好" result = raw_str.translate(table) print result
?
結果:
?
結論: 中文無意義, 不過一般來說, 做日志分析之類的工作時, 面對的多數是英文, 此時作用還是很大的.
?