我很确定我的代码是正确的,但它似乎没有返回预期的输出:
输入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
答案 0 :(得分:14)
函数str.replace(old, new[, max])
不会更改c
字符串本身(wrt到你调用的c
)只返回一个新字符串,其中旧的字符串已被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]);
我正在做的是迭代字符串,如果一个字母不是元音,那么只将它包含在列表中(过滤器)。过滤后,我将列表作为字符串加入。
答案 1 :(得分:8)
为什么不用regexp来做?根据{{3}},这样的事情应该有效:
import re
def anti_vowel(s):
result = re.sub(r'[AEIOU]', '', s, flags=re.IGNORECASE)
return result
如果您经常使用该功能,则可以编译正则表达式并使用编译版本。
答案 2 :(得分:6)
尝试使用String.translate。
>>> "Hey look words".translate(None, 'aeiouAEIOU')
'Hy lk wrds'
string.translate(s,table [,deletechars])
删除deletechars中的所有字符(如果存在),然后使用table翻译字符,该表必须是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'
答案 3 :(得分:4)
你应该这样做:
将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])
答案 4 :(得分:4)
另一个选择是放弃元音变量并将字符串放在循环中。
def anti_vowel(text):
for i in "aeiouAEIOU":
text = text.replace(i,"")
return text
print anti_vowel("HappIEAOy")
答案 5 :(得分:2)
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
答案 6 :(得分:1)
另一种更简单的方法是从字符串中提取非元音字符并返回它们。
def anti_vowel(text):
newstring=""
for i in text:
if i not in "aeiouAEIOU":
newstring=newstring+i
text=newstring
return text
答案 7 :(得分:1)
def anti_vowel(text):
new=[]
vowels = ("aeiouAEIOU")
for i in text:
if i not in vowels:
new.append(i)
return ''.join(new)
我希望这会有所帮助..
答案 8 :(得分:1)
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!')
答案 9 :(得分:0)
我知道在这个问题上有很多正确的解决方案,但我想添加一些有趣的方法来解决这个问题。 如果您来自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)
答案 10 :(得分:0)
我的实施:
# 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)
答案 11 :(得分:0)
一种相当简单的方法可能是;
def anti_vowel(text):
t = ''
for c in text:
if c in "aeiouAEIOU":
pass
else:
t += c
return t
答案 12 :(得分:0)
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