【问题标题】:Trying to delete vowels from a string fails [duplicate]尝试从字符串中删除元音失败[重复]
【发布时间】:2014-09-09 11:56:13
【问题描述】:

这段代码有什么问题?目的是检查输入的字符串是否包含元音并删除它们

代码如下:

def anti_vowel(text):
    text = str(text)
    vowel = "aeiouAEIOU"
    for i in text:
        for i in vowel.lower():
            text = text.replace('i',' ')
        for i in vowel.upper():
            text = text.replace('i',' ')
    return text

这是 Codecademy 的一课

【问题讨论】:

  • 您使用 Python 3 标记了此内容,但 Code Academy 的原始链接使用他们的 Python 2 在线代码会话。我的str.translate() 答案必须针对 Python 2 进行调整,因此请确保那里有正确的标签。供将来参考:始终在此处包含您的代码,而不是链接,并包含您使用的输入、您获得的输出以及您期望获得的内容。
  • ''.join([e for e in tgt if e.lower() not in 'aeiou'])

标签: python python-3.x


【解决方案1】:

您正在尝试将 字符串替换为值 'i',而不是变量 i 的内容。

你的代码效率也很低;您不需要遍历text 中的每个字符;一个循环 vowel 就足够了。因为您已经包含了大写和小写版本,所以在小写和大写版本上的两个循环实质上是检查每个元音 4 次

以下内容就足够了:

def anti_vowel(text):
    text = str(text)
    vowel = "aeiouAEIOU"
    for i in vowel:
        text = text.replace(i,' ')
    return text

您还用空格替换元音,而不仅仅是删除它们。

删除(而不是替换)所有元音的最快方法是使用str.translate()

def anti_vowel(text):
    return text.translate(text.maketrans('', '', 'aeiouAEIOU'))

str.maketrans() static method 生成一个映射,该映射将删除第三个参数中命名的所有字符。

【讨论】:

  • 看看maketranstext.translate(dict.fromkeys(map(ord, 'AEIOUaeiou'))) 之间的折腾会很有趣
  • @JonClements:确实应该将它设置为默认的函数参数,但我不想在这里把信封推得太远。 def anti_vowel(text, _mapping=str.maketrans('', '', 'aeiouAEIOU')): return text.translate(_mapping).
  • 确实......我们现在缺少的只是re.sub('[aeiou]', '', text, flags=RE.I) 或其他东西 - 然后我们可以对每周被问几次的问题有一个规范的答案......
  • @JonClements: hrm,那样的话我还需要添加一个Python 2版本;不知道我现在能不能挤进去。也许今晚。
猜你喜欢
  • 2014-06-04
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 2013-07-07
  • 2018-11-23
相关资源
最近更新 更多