【问题标题】:Remove vowels from a string [duplicate]从字符串中删除元音[重复]
【发布时间】:2014-06-04 06:06:53
【问题描述】:

我试图在标题中尽可能清楚,但很难简单地解释它。我必须从某个字符串中删除所有元音;为此,我创建了一个循环,该循环遍历由该字符串的字符组成的列表,删除元音,然后加入它们:

def anti_vowel(text):
    vow = ["a", "e", "i", "o", "u"]
    chars = []

    for i in text:
        chars.append(i)

    for i in chars:
        if i.lower() in vow:
            chars.remove(i)

    return "".join(chars)

问题是当我运行代码时,总会有一个元音不会被删除。例子:

>>> anti_vowel("Hey look Words!")
Hy lk Words!

>>> anti_vowel("Frustration is real")
Frstrton s ral

我绝不是 Python 方面的专家,但这令人困惑。为什么它会删除一些字母而保留其他字母,即使它们完全相同?

【问题讨论】:

  • this
  • 我知道循环遍历一个列表并从同一个列表中删除元素是不好的。您可以复制copylist = origlist[:],但还有其他方法可以做您想做的事情
  • 要从字符串中删除元音,你可以使用类似的东西:text.translate({ord(v):'' for v in 'aeiouAEIOU'})。由于您不是在寻求解决方法,因此我将其留在这里作为评论。

标签: python python-2.7


【解决方案1】:

@arshajii 的评论解释了为什么在循环中删除字符不是一个好主意。 要解决您的代码中的问题,(请注意,有更有效的方法可以实现这一点,但看起来您正在学习,所以我将其留在这里。)

def anti_vowel(text):
    vow = ["a", "e", "i", "o", "u"]
    chars = []

    for i in text: #No need of the two separate loops
        if i.lower() not in vow:
            chars.append(i)

    return "".join(chars)

演示:

>>> def anti_vowel(text):
...     vow = ["a", "e", "i", "o", "u"]
...     chars = []
...     for i in text: #No need of the two separate loops
...         if i.lower() not in vow:
...             chars.append(i)
...     return "".join(chars)
... 
>>> anti_vowel("Hey look Words!")
'Hy lk Wrds!'
>>> anti_vowel("Frustration is real") 
'Frstrtn s rl'
>>> 

【讨论】:

  • 在回答问题时投赞成票,但如果稍微复杂一点,使用正则表达式和子字符串可能会更有效。
  • @aruisdante 同意。但正如我所提到的,OP 似乎在学习 python,只是想帮助纠正代码。
  • 非常感谢,我找到了另一种修复代码的方法,但我很想知道 Python 如何决定保留哪些字母,哪些不保留。原来问题中已经解释过了,我的搜索显然不够彻底。
【解决方案2】:

这是一种可行的方法:

mytext = 'hello world!'
vowels = ['a', 'e', 'i', 'o', 'u']
result = ''
for letter in mytext:
    if letter not in vowels:
        result += letter

print(result)

【讨论】:

  • 这是非常低效的,因为每次你做result +=时python都需要分配一个新的字符串。您可以使用列表推导作为连接的输入来完成相同的操作,而无需使用加号,但最好还是这样做
  • 但是循环遍历字符串真是太酷了!不过说真的,你会建议尽可能不要使用 += 吗?
  • 带字符串,是的。在某处有一个关于优化 python 的 PEP 和 += 用于字符串(以及 +)是他们的低效优化之一。两者都可以通过适当使用 joinformat 来替换
【解决方案3】:

如果您的目标是返回一个等于删除元音的原始字符串的字符串,请尝试:

import re
def anti_vowel(text):
    return re.sub("[aeiou]+", "", text)

【讨论】:

    猜你喜欢
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 2018-11-23
    • 2021-05-23
    • 1970-01-01
    相关资源
    最近更新 更多