2017-08-29 50 views
-1
def disemvowel(string): 
    vowels = ('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U') 
    listString = list(string) 
    for t in listString: 
     if t in vowels: 
      listString.remove(t) 
    string = ''.join(listString) 
    return string 

功能應該去掉所有的元音,如果輸入的是:函數刪除字符串元音不工作,如果元音連續出現

'This website is for losers LOL!' 

正確的輸出應該是:

'Ths wbst s fr lsrs LL!' 

但是現在我改變了輸入,使元音連續出現,即

'This websitea is for loosers LOL!' 

輸出成爲

'Ths wbsta s fr losrs LL!' 

這是不正確(參見'wbsta''losrs')。

+0

重複刪除:不是一個好計劃 –

+0

爲什麼要刪除t? – user8478480

+0

爲什麼不用正則表達式代替're.sub(「[aeiou]」,「」,string,flags = re.I)' –

回答

4

爲什麼不從元音字符中構造字符串,而不是去除元音字母?

return ''.join([c for c in string if c not in vowels]) 
+0

發生器不會比列表理解更可取嗎? – Alexander

+1

不適合'join'列表理解更好,因爲['str.join'需要一個序列](https://github.com/python/cpython/blob/v3.6.2/Objects/unicodeobject.c#L9903)和如果它不是一個序列,它會立即將它轉換爲一個列表(額外開銷)。 – MSeifert

+1

要添加到@MSeifert評論,這是因爲在幕後,'str.join'將傳入的迭代器轉換爲列表。傳遞一個生成器會產生額外的開銷。如果您好奇,可以在[這裏]看到實現細節(https://github.com/python/cpython/blob/master/Objects/stringlib/join.h#L22)。 –

1

從迭代的東西中刪除項目通常不是一個好主意,因爲這會在迭代過程中產生影響。因此,而不是從字符串中刪除元音的字符,而是將不是元音的字符添加到新字符串中。

def disemvowel(string): 
    vowels = ('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U') 
    listString = list(string) 
    string = "" 
    for t in listString 
     if t not in listString 
      string += t 

    return string