我必须输入一个字符串,删除所有空格并打印不带元音的字符串。我还必须打印一串所有删除的元音。
我已经非常接近这个目标,但出于某种原因,当我尝试删除所有元音时,它不会连续删除两个元音。为什么是这样?请为这个特定的代码块提供答案,因为解决方案帮助我解决了挑战,但不是我的具体问题
# first define our function
def disemvowel(words):
# separate the sentence into separate letters in a list
no_v = list(words.lower().replace(" ", ""))
print no_v
# create an empty list for all vowels
v = []
# assign the number 0 to a
a = 0
for l in no_v:
# if a letter in the list is a vowel:
if l == "a" or l == "e" or l == "i" or l == "o" or l == "u":
# add it to the vowel list
v.append(l)
#print v
# delete it from the original list with a
del no_v[a]
print no_v
# increment a by 1, in order to keep a's position in the list moving
else:
a += 1
# print both lists with all spaces removed, joined together
print "".join(no_v)
print "".join(v)
disemvowel(raw_input(""))
答案 0 :(得分:0)
您在迭代时修改no_v
。制作两个新列表更简单,一个是元音,另一个是没有。
另一种选择是将其转换为while循环:
while a < len(no_v):
l = no_v[a]
通过这种方式,您只需使用一个变量跟踪no_v
中的位置,而不是当前的两个变量。
答案 1 :(得分:0)
出于教育目的,这一切都可以显着减少麻烦。
def devowel(input_str, vowels="aeiou"):
filtered_chars = [char for char in input_str
if char.lower() not in vowels and not char.isspace()]
return ''.join(filtered_chars)
assert devowel('big BOOM') == 'bgBM'
为了帮助您学习,请执行以下操作:
True
。len()
,而是迭代字符,如for char in input_str:
。filter
功能。答案 2 :(得分:0)
所以还有很多其他的,也许更好的方法来解决这个问题。但正如你所提到的,我只讨论你的失败或你可以做得更好。
<强> 1。列出输入词
有很多你可以做得更好的
no_v = list(words.lower().replace(" ", ""))
您不能替换" " -> " "
的所有空间,因此请改用
no_v = list(words.lower().translate( None, string.whitespace))
<强> 2。用while循环替换for循环
因为如果删除列表中的元素,for l in no_v:
将转到下一个位置。但是由于删除你需要相同的位置,删除no_v中的所有元音并将它们放在v中。
while a < len(no_v):
l = no_v[a]
第3。返回值
因为它的功能是不打印值只是返回它们。在这种情况下,请替换print no_v
print v
,然后返回并打印它们。
return (no_v,v) # returning both lists as tuple
<强> 4。这不是错误,而是为python 3.x
做好准备尝试始终使用print("Have a nice day")
代替print "Have a nice day"
您的算法现在看起来像这样
import string
def disemvowel(words):
no_v = list(words.lower().translate( None, string.whitespace))
v = []
a = 0
while a < len(no_v):
l = no_v[a]
if l == "a" or l == "e" or l == "i" or l == "o" or l == "u":
v.append(l)
del no_v[a]
else:
a += 1
return ("".join(no_v),"".join(v))
print(disemvowel("Stackoverflow is cool !"))
<强>输出强>
对于句子Stackoverflow is cool !\n
,它输出
('stckvrflwscl!', 'aoeoioo')
没问,但我给你一个我可能会用的解决方案。因为它与字符串替换有关,或匹配我只会使用正则表达式。
def myDisemvowel(words):
words = words.lower().translate( None, string.whitespace)
nv = re.sub("[aeiou]*","", words)
v = re.sub("[^a^e^i^o^u]*","", words)
return (nv, v)
print(myDisemvowel("Stackoverflow is cool !\n"))
我只使用正则表达式,对于nv字符串,我只用空字符串替换所有voewls。对于元音字符串,我只需用空字符串替换所有非元音的组。如果你写这个压缩,你可以用2行代码解决这个问题(只需返回替换)
<强>输出强>
对于句子Stackoverflow is cool !\n
,它输出
('stckvrflwscl!', 'aoeoioo')