我正在编写一个删除单词中所有元音的函数。它看起来像这样:
def remove_vowels(word):
vowels = ['a', 'e', 'i', 'o', 'u']
word = list(word)
for letter in word:
print('Looking for letter {}'.format(letter))
if letter.lower() in vowels:
try:
word.remove(letter)
except ValueError:
pass
return ''.join(word)
我希望它能查看单词中的所有字母,检查每个字母是否在元音数组中,如果是,则将其删除。
然而,它似乎并不检查所有字母。例如,对于以下呼叫:
print(remove_vowels('perception'))
我得到以下输出:
Looking for letter p
Looking for letter e
Looking for letter c
Looking for letter e
Looking for letter t
Looking for letter i
Looking for letter n
prcpton
出于某种原因,它会跳过r
,第二个p
和o
。我用其他的话得到了类似的结果。为什么会这样?
答案 0 :(得分:3)
之前没有工作的原因是在for循环期间你正在改变word
这意味着每当你删除某些内容时它会跳过迭代,因为删除会导致每个字母向上移动一个位置。这意味着如果在位置2处有删除,那么下一个项目现在位于第2位,而它之后的项目位于第3位,即下一次迭代所在的位置。
def remove_vowels(word):
vowels = ['a', 'e', 'i', 'o', 'u']
word = list(word)
print(word)
new_word = []
for letter in word:
print('Looking for letter {}'.format(letter))
if letter.lower() not in vowels:
try:
new_word.append(letter)
except ValueError:
pass
return ''.join(new_word)
print(remove_vowels('perception'))
答案 1 :(得分:1)
如评论中所述,处理您正在迭代的元素通常很麻烦。怎么样:
<强>代码:强>
def remove_vowels(word):
vowels = set('aeiou')
return ''.join(l for l in word if l not in vowels)
测试代码:
print(remove_vowels('perception'))
<强>结果:强>
prcptn
答案 2 :(得分:0)
def remove_vowels(word):
vowels = ['a', 'e', 'i', 'o', 'u']
word = list(word)
result = list()
for letter in word:
print('Looking for letter {}'.format(letter))
if letter.lower() not in vowels:
try:
result.append(letter)
except ValueError:
pass
return ''.join(result)
print(remove_vowels('perception'))
答案 3 :(得分:0)
def remove_vowels(word):
vowels = ['a', 'e', 'i', 'o', 'u']
word = list(word)
word_new = []
for letter in word:
print('Looking for letter {}'.format(letter))
if letter.lower() in vowels:
continue
else:
word_new.append(letter)
return ''.join(word_new)
print(remove_vowels('perception'))