循环“忘记”以删除某些项目

循环“忘记”以删除某些项目

在这段代码中,我试图创建一个函数antioowel,它将从字符串中删除所有元音(AeiouAEIOU)。我觉得工作正常,但当我运行它时,样本文本“嘿,看单词!”返回为“Hy lk Word!”它“忘记”删除最后的‘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)


紫衣仙女
浏览 440回答 3
3回答

扬帆大鱼

您正在修改正在迭代的列表,这必然会导致一些不直观的行为。相反,创建列表的副本,这样就不会从迭代的内容中删除元素。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!那怎么回事?好人for x in yPython中的循环实际上只是语法糖:它仍然按索引访问List元素。因此,当您在迭代列表时从列表中删除元素时,您将开始跳过值(如上面所示)。因此,你永远看不到第二个o在……里面"look";跳过它,因为当删除前一个元素时,索引已经“过去”了。然后,当你到达o在……里面"Words",您将移除第一次出现的'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')

小怪兽爱吃肉

其他答案告诉你为什么for更改列表时跳过项。这个答案告诉您如何在没有显式循环的情况下删除字符串中的字符。使用str.translate():vowels = 'aeiou'vowels += vowels.upper()text.translate(None, vowels)这将删除第二个参数中列出的所有字符。演示:>>> text = "Hey look Words!">>> vowels = 'aeiou'>>> vowels += vowels.upper()>>> text.translate(None, vowels)'Hy lk Wrds!' >>> text = 'The Quick Brown Fox Jumps Over The Lazy Fox'>>> text.translate(None, vowels)'Th Qck Brwn Fx Jmps vr Th Lzy Fx'在Python 3中,str.translate()方法(Python 2:unicode.translate())不同之处在于它不需要缺失体参数;第一个参数是将Unicode序数(整数值)映射到新值的字典。使用None对于需要删除的任何字符:# Python 3 codevowels = 'aeiou'vowels += vowels.upper()vowels_table = dict.fromkeys(map(ord, vowels))text.translate(vowels_table)您还可以使用str.maketrans()静态法为了绘制这幅地图:vowels = 'aeiou'vowels += vowels.upper()text.translate(text.maketrans('', '', vowels))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python