为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

紫衣仙女 2019-06-03 13:57:27
循环“忘记”以删除某些项目在这段代码中,我试图创建一个函数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)
查看完整描述

3 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

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


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')


查看完整回答
反对 回复 2019-06-03
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

其他答案告诉你为什么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))


查看完整回答
反对 回复 2019-06-03
  • 3 回答
  • 0 关注
  • 438 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信