2017-08-29 33 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