gpt4 book ai didi

python - 循环 "Forgets"删除一些项目

转载 作者:IT老高 更新时间:2023-10-28 21:32:08 26 4
gpt4 key购买 nike

在这段代码中,我试图创建一个函数 anti_vowel,它将从字符串中删除所有元音 (aeiouAEIOU)。我认为它应该可以正常工作,但是当我运行它时,示例文本“Hey look Words!”以“Hy lk Words!”的形式返回。它“忘记”删除最后一个'o'。这怎么可能?

text = "Hey look Words!"

def anti_vowel(text):

textlist = list(text)

for char in textlist:
if char.lower() in 'aeiou':
textlist.remove(char)

return "".join(textlist)

print anti_vowel(text)

最佳答案

您正在修改您正在迭代的列表,这势必会导致一些不直观的行为。相反,制作列表的副本,这样您就不会从正在迭代的内容中删除元素。

for char in textlist[:]: #shallow copy of the list
# etc

要澄清您看到的行为,请查看此内容。将 print char, textlist 放在(原始)循环的开头。您可能希望这会在列表旁边垂直打印出您的字符串,但您实际得到的是:

H ['H', 'e', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']
e ['H', 'e', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']
['H', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] # !
l ['H', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']
o ['H', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']
k ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] # Problem!!
['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']
W ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']
o ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']
d ['H', 'y', ' ', 'l', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']
s ['H', 'y', ' ', 'l', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']
! ['H', 'y', ' ', 'l', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!']
Hy lk Words!

那么发生了什么? Python 中漂亮的 for x in y 循环实际上只是语法糖:它仍然按索引访问列表元素。因此,当您在迭代列表时从列表中删除元素时,您会开始跳过值(如上所示)。结果,您永远不会在 "look" 中看到第二个 o;你跳过它是因为当你删除前一个元素时索引已经“过去”了它。然后,当你到达 "Words" 中的 o 时,你去删除第一次出现的 'o',也就是那个你之前跳过了。


正如其他人所提到的,列表推导式可能是一种更好(更清晰、更清晰)的方式来做到这一点。利用 Python 字符串可迭代的事实:

def remove_vowels(text): # function names should start with verbs! :)
return ''.join(ch for ch in text if ch.lower() not in 'aeiou')

关于python - 循环 "Forgets"删除一些项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17299581/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com