Python for循环没有循环遍历所有项目
我正在编写一个从单词中删除所有元音的函数。它看起来像这样:Python for循环没有循环遍历所有项目
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
。我用其他词语得到了类似的结果。这是为什么发生?
之所以说它在您的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'))
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'))
正如评论中提到的那样,处理正在迭代的元素通常很麻烦。这个怎么样:
代码:
def remove_vowels(word):
vowels = set('aeiou')
return ''.join(l for l in word if l not in vowels)
测试代码:
print(remove_vowels('perception'))
结果:
prcptn
哇,这很简洁。但我只是学习Python,所以我会坚持更容易阅读解决方案。 –
@IgorSkoldin,感谢您的反馈,是的,您一定要随心所欲。不过,我衷心的推荐,以及我在初学者帖子上发布这些解决方案的原因是,您花时间学习这种语法。它不像最初看起来那样艰难,而且它是非常强大的。欢呼声,祝你好运。 –
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'))
因为'word.remove(字母)'删除元音和你迭代相同'word'名单。现在他们有不同的'索引'。尝试将元素添加到新列表。 – sinsuren
[迭代时从列表中删除项目]可能的重复(http://stackoverflow.com/questions/1207406/remove-items-from-a-list-while-iterating) – McGrady