我很确定我的代码是正确的,但它似乎没有返回预期的输出:
输入
anti_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
字符串本身(相对于您调用的c
)。它只是返回一个新字符串,其中出现的 old
已替换为 new
。所以 newstr
只包含一个被 c
字符串中最后一个元音替换的字符串,即 o
,因此你得到 "Hey lk wrds"
,与 "Hey look words".replace('o', '')
相同。
我认为你可以简单地将
anti_vowel(c)
写为:
''.join([l for l in c if l not in vowels]);
我正在做的是迭代字符串,如果字母不是元音,则仅将其包含到
list(filters)
中。过滤后,我将列表连接回字符串。
为什么不用正则表达式来做呢?根据文档,这样的东西应该有效:
import re
def anti_vowel(s):
result = re.sub(r'[AEIOU]', '', s, flags=re.IGNORECASE)
return result
如果您经常使用该函数,您可以编译正则表达式并使用编译后的版本。
尝试 String.translate。
>>> "Hey look words".translate(None, 'aeiouAEIOU')
'Hy lk wrds'
string.translate(s,表[,deletechars])
从 s 中删除 deletechars 中的所有字符(如果存在),然后使用表翻译这些字符,该表必须是一个 256 个字符的字符串,给出每个字符值的翻译,按其序号索引。如果 table 为 None,则仅执行字符删除步骤。
https://docs.python.org/2/library/string.html#string.Template.substitute
或者如果您使用的是新奇的 Python 3:
>>> table = str.maketrans(dict.fromkeys('aeiouAEIOU'))
>>> "Hey look words.translate(table)
'Hy lk wrds'
另一种选择是放弃元音变量并将要删除的字符放入循环中。
def anti_vowel(text):
for i in "aeiouAEIOU":
text = text.replace(i,"")
return text
print anti_vowel("HappIEAOy")
你应该这样做:
将
newstr
初始化为c
,然后
for x in c.lower():
if x in vowels:
newstr = newstr.replace(x, "")
这是因为
str.replace(old, new[, max])
在替换字符后返回字符串的副本:
replace() 方法返回字符串的副本,其中 旧的出现已被新的替换,可选地限制 更换次数达到最大。
所以,这是正确的代码:
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])
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
另一种更简单的方法是从字符串中提取非元音字符并返回它们。
def anti_vowel(text):
newstring=""
for i in text:
if i not in "aeiouAEIOU":
newstring=newstring+i
text=newstring
return text
我知道这个问题有很多正确的解决方案,但我想添加一些有趣的方法来解决这个问题。 如果您来自 C++/C# 或 Java,您将倾向于使用诸如比较然后操作之类的操作,使用索引来删除 for 循环中不需要的条目。 Python有Remove和Del函数。删除函数使用值和 del 使用索引。Pythonic 解决方案在最后一个函数中。让我们看看如何做到这一点:
这里我们在 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)
使用删除功能:
def remove_vol(str1):
list1 = list(str1)
list2 = list(str1)
for i in list1:
if i in volwes:
list2.remove(i)
print(list2)
使用索引构建不包含不需要的字符的新字符串:
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)
与上面的解决方案相同,但使用值:
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)
def anti_vowel(text):
new=[]
vowels = ("aeiouAEIOU")
for i in text:
if i not in vowels:
new.append(i)
return ''.join(new)
我希望这有帮助..
def anti_vowel(text):
new_text = ""
for i in text:
if i == 'a' or i == 'A':
pass
elif i == 'e' or i == 'E':
pass
elif i == 'I' or i == 'i':
pass
elif i == 'o' or i == 'O':
pass
elif i == 'u' or i == 'U':
pass
else:
new_text = new_text + i
return new_text
print anti_vowel('Hey look Words!')
我的实现:
# Ask the user for input:
user_input = input("enter a string with some vowels: ")
print("input string: " + str(user_input))
vowels = ('a','e','i','o','u','A','E','I','O','U')
new_string="";
for i in range(0,len(user_input),1):
if user_input[i] in vowels:
print ('found a vowel, removing...')
else:
new_string+=user_input[i]
print("I've removed the vowels for you. You're welcome! The new string is: " + new_string)
一个相当简单的方法可能是;
def anti_vowel(text):
t = ''
for c in text:
if c in "aeiouAEIOU":
pass
else:
t += c
return t
def anti_vowel(text):
t=""
for c in text:
for i in "ieaouIEAOU":
if c==i:
c=""
else:
c=c
t=t+c
return t