codewars(python)練習(xí)筆記二:去除字符串中的元音字母
題目:
Trolls are attacking your comment section!
A common way to deal with this situation is to remove all of the vowels from the trolls' comments, neutralizing the threat.
Your task is to write a function that takes a string and return a new string with all vowels removed.
For example, the string "This website is for losers LOL!" would become "Ths wbst s fr lsrs LL!".
Note: for this kata y isn't considered a vowel.
題目大意:
你的任務(wù)是編寫(xiě)一個(gè)函數(shù),它接受一個(gè)字符串并返回一個(gè)刪除了所有元音的新字符串。
例如,字符串“This website for for losers LOL!”會(huì)變成“Ths wbst s fr lsrs LL!”。
注意:對(duì)于這個(gè) y不被視為元音。
我的解法:
def disemvowel(string):
string = string.replace('a','').replace('e','').replace('i','').replace('o','').replace('u','')
string = string.replace('A','').replace('E','').replace('I','').replace('O','').replace('U','')
return string
哈哈哈,我承認(rèn)我是個(gè)逗比了,主要是昨天的題給我的印象比較深,第一反應(yīng)就是這樣,哎。
常規(guī)解法:
def disemvowel(string):
out=[]
mystring=list(string)
for i in mystring:
if i not in ["a","e","i","o","u","A","E","I","O","U"]:
out.append(i)
return ''.join(out)
我仔細(xì)想了想,無(wú)論怎么寫(xiě),時(shí)間復(fù)雜度都是m*n, 因?yàn)橹辽倌阋袛鄐tring中的每一個(gè)字母是不是在元音字母中的,無(wú)非是寫(xiě)法上優(yōu)雅不優(yōu)雅。
牛逼解法:
def disemvowel(string):
return string.translate(None, "aeiouAEIOU")
關(guān)于translate()函數(shù)
translate(table, deletechars="")
str.translate(table, deletechars="")
根據(jù) str 給出的表(包含 256 個(gè)字符)轉(zhuǎn)換 string 的字符, 要過(guò)濾掉的字符放到 deletechars 參數(shù)中 |
以下實(shí)例展示了 translate()函數(shù)的使用方法:
#!/usr/bin/python
from string
intab = "aeiou"
outtab = "12345"
deltab = "thw"
trantab = string.maketrans(intab,outtab) # 創(chuàng)建字符映射轉(zhuǎn)換表
test = "this is string example....wow!!!";
print test.translate(trantab);
print test.translate(trantab,deltab); # Python2中,刪除指定字符在 translate() 方法中
以上實(shí)例輸出結(jié)果如下:
th3s 3s str3ng 2x1mpl2....w4w!!!
3s 3s sr3ng 2x1mpl2....4!!!
translate()是個(gè)翻譯函數(shù),是將制定的字母表intab[]翻譯為對(duì)應(yīng)的映射表outtab[],并刪除deltab[]。是python 的字符串內(nèi)建函數(shù)。
python的字符串內(nèi)建函數(shù)
字符串方法是從python1.6到2.0慢慢加進(jìn)來(lái)的——它們也被加到了Jython中。
這些方法實(shí)現(xiàn)了string模塊的大部分方法,如下表所示列出了目前字符串內(nèi)建支持的方法,所有的方法都包含了對(duì)Unicode的支持,有一些甚至是專(zhuān)門(mén)用于Unicode的。
下面就是從菜鳥(niǎo)筆記中摘過(guò)來(lái)的python 的字符串內(nèi)建函數(shù)表。
| 方法 | 描述 |
|---|---|
| string.capitalize() | 把字符串的第一個(gè)字符大寫(xiě) |
| string.center(width) | 返回一個(gè)原字符串居中,并使用空格填充至長(zhǎng)度 width 的新字符串 |
| string.count(str, beg=0, end=len(string)) | 返回 str 在 string 里面出現(xiàn)的次數(shù),如果 beg 或者 end 指定則返回指定范圍內(nèi) str 出現(xiàn)的次數(shù) |
| string.decode(encoding='UTF-8', errors='strict') | 以 encoding 指定的編碼格式解碼 string,如果出錯(cuò)默認(rèn)報(bào)一個(gè) ValueError 的 異 常 , 除非 errors 指 定 的 是 'ignore' 或 者'replace' |
| string.encode(encoding='UTF-8', errors='strict') | 以 encoding 指定的編碼格式編碼 string,如果出錯(cuò)默認(rèn)報(bào)一個(gè)ValueError 的異常,除非 errors 指定的是'ignore'或者'replace' |
| string.endswith(obj, beg=0, end=len(string)) | 檢查字符串是否以 obj 結(jié)束,如果beg 或者 end 指定則檢查指定的范圍內(nèi)是否以 obj 結(jié)束,如果是,返回 True,否則返回 False. |
| string.expandtabs(tabsize=8) | 把字符串 string 中的 tab 符號(hào)轉(zhuǎn)為空格,tab 符號(hào)默認(rèn)的空格數(shù)是 8。 |
| string.find(str, beg=0, end=len(string)) | 檢測(cè) str 是否包含在 string 中,如果 beg 和 end 指定范圍,則檢查是否包含在指定范圍內(nèi),如果是返回開(kāi)始的索引值,否則返回-1 |
| string.format() | 格式化字符串 |
| string.index(str, beg=0, end=len(string)) | 跟find()方法一樣,只不過(guò)如果str不在 string中會(huì)報(bào)一個(gè)異常. |
| string.isalnum() | 如果 string 至少有一個(gè)字符并且所有字符都是字母或數(shù)字則返回 True,否則返回 False |
| string.isalpha() | 如果 string 至少有一個(gè)字符并且所有字符都是字母則返回 True,否則返回 False |
| string.isdecimal() | 如果 string 只包含十進(jìn)制數(shù)字則返回 True 否則返回 False. |
| string.isdigit() | 如果 string 只包含數(shù)字則返回 True 否則返回 False. |
| string.islower() | 如果 string 中包含至少一個(gè)區(qū)分大小寫(xiě)的字符,并且所有這些(區(qū)分大小寫(xiě)的)字符都是小寫(xiě),則返回 True,否則返回 False |
| string.isnumeric() | 如果 string 中只包含數(shù)字字符,則返回 True,否則返回 False |
| string.isspace() | 如果 string 中只包含空格,則返回 True,否則返回 False. |
| string.istitle() | 如果 string 是標(biāo)題化的(見(jiàn) title())則返回 True,否則返回 False |
| string.isupper() | 如果 string 中包含至少一個(gè)區(qū)分大小寫(xiě)的字符,并且所有這些(區(qū)分大小寫(xiě)的)字符都是大寫(xiě),則返回 True,否則返回 False |
| string.join(seq) | 以 string 作為分隔符,將 seq 中所有的元素(的字符串表示)合并為一個(gè)新的字符串 |
| string.ljust(width) | 返回一個(gè)原字符串左對(duì)齊,并使用空格填充至長(zhǎng)度 width 的新字符串 |
| string.lower() | 轉(zhuǎn)換 string 中所有大寫(xiě)字符為小寫(xiě). |
| string.lstrip() | 截掉 string 左邊的空格 |
| string.maketrans(intab, outtab) | maketrans() 方法用于創(chuàng)建字符映射的轉(zhuǎn)換表,對(duì)于接受兩個(gè)參數(shù)的最簡(jiǎn)單的調(diào)用方式,第一個(gè)參數(shù)是字符串,表示需要轉(zhuǎn)換的字符,第二個(gè)參數(shù)也是字符串表示轉(zhuǎn)換的目標(biāo)。 |
| max(str) | 返回字符串 str 中最大的字母。 |
| min(str) | 返回字符串 str 中最小的字母。 |
| string.partition(str) | 有點(diǎn)像 find()和 split()的結(jié)合體,從 str 出現(xiàn)的第一個(gè)位置起,把 字 符 串 string 分 成 一 個(gè) 3 元 素 的 元 組 (string_pre_str,str,string_post_str),如果 string 中不包含str 則 string_pre_str == string. |
| string.replace(str1, str2, num=string.count(str1)) | 把 string 中的 str1 替換成 str2,如果 num 指定,則替換不超過(guò) num 次. |
| string.rfind(str, beg=0,end=len(string) ) | 類(lèi)似于 find()函數(shù),不過(guò)是從右邊開(kāi)始查找. |
| string.rindex( str, beg=0,end=len(string)) | 類(lèi)似于 index(),不過(guò)是從右邊開(kāi)始. |
| string.rjust(width) | 返回一個(gè)原字符串右對(duì)齊,并使用空格填充至長(zhǎng)度 width 的新字符串 |
| string.rpartition(str) | 類(lèi)似于 partition()函數(shù),不過(guò)是從右邊開(kāi)始查找. |
| string.rstrip() | 刪除 string 字符串末尾的空格. |
| string.split(str="", num=string.count(str)) | 以 str 為分隔符切片 string,如果 num有指定值,則僅分隔 num 個(gè)子字符串 |
| string.splitlines([keepends]) | 按照行('\r', '\r\n', \n')分隔,返回一個(gè)包含各行作為元素的列表,如果參數(shù) keepends 為 False,不包含換行符,如果為 True,則保留換行符。 |
| string.startswith(obj, beg=0,end=len(string)) | 檢查字符串是否是以 obj 開(kāi)頭,是則返回 True,否則返回 False。如果beg 和 end 指定值,則在指定范圍內(nèi)檢查. |
| string.strip([obj]) | 在 string 上執(zhí)行 lstrip()和 rstrip() |
| string.swapcase() | 翻轉(zhuǎn) string 中的大小寫(xiě) |
| string.title() | 返回"標(biāo)題化"的 string,就是說(shuō)所有單詞都是以大寫(xiě)開(kāi)始,其余字母均為小寫(xiě)(見(jiàn) istitle()) |
| string.translate(str, del="") | 根據(jù) str 給出的表(包含 256 個(gè)字符)轉(zhuǎn)換 string 的字符,要過(guò)濾掉的字符放到 del 參數(shù)中 |
| string.upper() | 轉(zhuǎn)換 string 中的小寫(xiě)字母為大寫(xiě) |
| string.zfill(width) | 返回長(zhǎng)度為 width 的字符串,原字符串 string 右對(duì)齊,前面填充0 |
| string.isdecimal() | isdecimal()方法檢查字符串是否只包含十進(jìn)制字符。這種方法只存在于unicode對(duì)象。 |