正确的代码,以从Python中的string中删除元音

我很确定我的代码是正确的,但它似乎没有返回预期的输出:

inputanti_vowel("Hey look words") – >输出: "Hey lk wrds"

显然这不是'e' ,任何人都可以解释为什么?

 def anti_vowel(c): newstr = "" vowels = ('a', 'e', 'i', 'o', 'u') for x in c.lower(): if x in vowels: newstr = c.replace(x, "") return newstr 

函数str.replace(old, new[, max])不会改变cstring本身(只要你调用)就返回一个新的string,旧的字符被新的字符replace。 所以newstr只是包含一个string取代的最后一个元音在cstring是o ,因此你得到"Hey lk wrds" ,就像"Hey look words".replace('o', '')

我想你可以简单地写下anti_vowel(c)

 ''.join([l for l in c if l not in vowels]); 

我正在做的是遍历string,如果一个字母不是元音,那么只包括它到列表(filter)。 过滤之后,我以string的forms返回列表。

你为什么不用正则expression式呢? 根据文档 ,这样的事情应该工作:

 import re def anti_wovel(s): result = re.sub(r'[AEIOU]', '', s, flags=re.IGNORECASE) return result 

如果您经常使用该函数,则可以编译正则expression式并使用编译后的版本。

你应该做这个:

newstr初始化为c ,然后

 for x in c.lower(): if x in vowels: newstr = newstr.replace(x, "") 

这是因为str.replace(old, new[, max])在replace字符后返回string的副本:

replace()方法返回一个string的副本,其中old被replace为new,可选地限制replace次数为max。

所以,这是正确的代码:

 def anti_vowel(c): newstr = c vowels = ('a', 'e', 'i', 'o', 'u') for x in c.lower(): if x in vowels: newstr = newstr.replace(x,"") return newstr 

你也可以用更为pythonic的方式来做到这一点:

 ''.join([x for x in c if x not in vowels]) 

尝试String.translate。

 >>> "Hey look words".translate(None, 'aeiouAEIOU') 'Hy lk wrds' 

string.translate(s,table [,deletechars])

从s中删除所有位于deletechars中的字符(如果存在),然后使用table转换字符,该表必须是一个256个字符的string,给出每个字符值的翻译,并按序号进行索引。 如果table是None,那么只执行字符删除步骤。

https://docs.python.org/2/library/string.html#string.Template.substitute

另一个select是放弃元音variables,并把字符删除在循环中。

  def anti_vowel(text): for i in "aeiouAEIOU": text = text.replace(i,"") return text print anti_vowel("HappIEAOy") 
 vowels = ('a', 'e', 'i', 'o', 'u', 'A', 'I', 'E', 'O', 'U') for char in text: if char in vowels: text = text.replace(char, '') return text 

一个更简单的方法可以是从string中提取非元音字符并将其返回。

 def anti_vowel(text): newstring="" for i in text: if i not in "aeiouAEIOU": newstring=newstring+i text=newstring return text 
 def anti_vowel(text): new=[] vowels = ("aeiouAEIOU") for i in text: if i not in vowels: new.append(i) return ''.join(new) 

我希望这有帮助..

我知道在这个问题上有很多正确的解决scheme,但我想增加一些有趣的方法来解决这个问题。 如果你来自C ++ / C#或者Java,那么你会倾向于使用类似比较的东西,然后使用索引来执行操作,以便在for循环中删除不需要的条目。 Python具有删除和删除function。 删除function使用数值和删除使用索引。pythonic解决scheme在最后的function。 让我们看看我们如何做到这一点:

这里我们在for循环中使用索引,del函数在C ++中非常相似:

 def remove_vol(str1): #list2 = list1 # this won't work bc list1 is the same as list2 meaning same container# list1 = list(str1) list2 = list(str1) for i in range(len(list1)): if list1[i] in volwes: vol = list1[i] x = list2.index(vol) del list2[x] print(list2) 

使用删除function:

 def remove_vol(str1): list1 = list(str1) list2 = list(str1) for i in list1: if i in volwes: list2.remove(i) print(list2) 

使用索引构build不包含不需要的字符的新string:

 def remove_vol(str1): list1 = list(str1) clean_str = '' for i in range(len(list1)): if list1[i] not in volwes: clean_str += ''.join(list1[i]) print(clean_str) 

与上面的解决scheme相同,但使用的值是:

 def remove_vol(str1): list1 = list(str1) clean_str = '' for i in list1: if i not in volwes: clean_str += ''.join(i) print(clean_str) 

你应该怎么做在python? 使用列表理解! 它很美:

 def remove_vol(list1): clean_str = ''.join([x for x in list1 if x.lower() not in volwes]) print(clean_str)