【问题标题】:Removing letters from a string in Python [duplicate]在Python中从字符串中删除字母[重复]
【发布时间】:2014-02-03 15:49:02
【问题描述】:

我写了一个函数来删除给定字符串中的元音。

def anti_vowel(text):
    text = list(text)
    vowel = 'aeiou'
    for letter in text:
        if letter.lower() in vowel:
            text.remove(letter)
    return ''.join(text)

当我输入“嘿,看看单词!”时,它不会删除所有元音。输出是“Hy lk Words!”

为什么这段代码不删除输入中的所有元音?

【问题讨论】:

  • this
  • 说真的,你发布了一个相同的代码,来自一个有 50 个投票的问题,它具有相同的输出.....你怎么能错过它。您甚至将函数命名为相同。什么鬼,哈哈。

标签: python list python-2.7 for-loop


【解决方案1】:

更改您正在循环的list 可能会导致不希望的结果。先复制一份:

for letter in text[:]:

使用[:] 称为列表切片。来自Python Docs

所有切片操作都会返回一个包含请求元素的新列表。这意味着以下切片返回列表a
>>> a[:]

的浅表副本

还有其他制作副本的方法,例如:

list(text)

阅读更多关于how to make a copy of a list的信息。

【讨论】:

    【解决方案2】:

    您正在迭代期间修改列表。一种解决方案是遍历列表的副本。另一种解决方案是避免副作用并发挥作用:

    def anti_vowel(text):
        return "".join(c for c in text if c.lower() not in 'aeiou')
    

    【讨论】:

      【解决方案3】:

      您可以使用正则表达式模式排除所有带帽子的元音 ^

      import re
      pattern = '([^aeiou])'
      str_ = "no vowels"
      no_vowel_list = re.findall(pattern,str_)
      print no_vowel_list
      

      【讨论】:

        【解决方案4】:

        这里有一个解决方案:

        def anti_vowel(text):
            text = list(text)
            result = list()
            for letter in text:
                if letter.lower() not in 'aeiou':
                    result.append(letter)
            return ''.join(result)
        
        s = 'Hey look Words!'
        print anti_vowel(s)
        

        输出:

        Hy lk Wrds!
        

        【讨论】:

        • 其实这并不能回答问题。问题是为什么,在它的原始副本上有一个很好的答案=)
        • 哦,你还有另一个同样的问题 :)
        猜你喜欢
        • 2017-03-11
        • 1970-01-01
        • 2021-06-05
        • 1970-01-01
        • 1970-01-01
        • 2020-03-20
        • 1970-01-01
        • 1970-01-01
        • 2014-04-26
        相关资源
        最近更新 更多