正确的代码,以从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])
不会改变c
string本身(只要你调用)就返回一个新的string,旧的字符被新的字符replace。 所以newstr
只是包含一个string取代的最后一个元音在c
string是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)