在Python中从字符串中删除元音的正确代码

问题描述 投票:0回答:13

我很确定我的代码是正确的,但它似乎没有返回预期的输出:

输入

anti_vowel("Hey look words")
--> 输出:
"Hey lk wrds"

显然它不适用于

'e'
,任何人都可以解释为什么吗?

def anti_vowel(c):
    newstr = ""
    vowels = ('a', 'e', 'i', 'o', 'u')
    for x in c.lower():
        if x in vowels:
            newstr = c.replace(x, "")        
    return newstr
python
13个回答
21
投票

函数

str.replace(old, new[, max])
不会更改
c
字符串本身(相对于您调用的
c
)。它只是返回一个新字符串,其中出现的
old
已替换为
new
。所以
newstr
只包含一个被
c
字符串中最后一个元音替换的字符串,即
o
,因此你得到
"Hey lk wrds"
,与
"Hey look words".replace('o', '')
相同。

我认为你可以简单地将

anti_vowel(c)
写为:

''.join([l for l in c if l not in vowels]);

我正在做的是迭代字符串,如果字母不是元音,则仅将其包含到

list(filters)
中。过滤后,我将列表连接回字符串。


16
投票

为什么不用正则表达式来做呢?根据文档,这样的东西应该有效:

import re

def anti_vowel(s):
    result = re.sub(r'[AEIOU]', '', s, flags=re.IGNORECASE)
    return result

如果您经常使用该函数,您可以编译正则表达式并使用编译后的版本。


11
投票

尝试 String.translate。

>>> "Hey look words".translate(None, 'aeiouAEIOU')
'Hy lk wrds'

string.translate(s,表[,deletechars])

从 s 中删除 deletechars 中的所有字符(如果存在),然后使用表翻译这些字符,该表必须是一个 256 个字符的字符串,给出每个字符值的翻译,按其序号索引。如果 table 为 None,则仅执行字符删除步骤。

https://docs.python.org/2/library/string.html#string.Template.substitute

或者如果您使用的是新奇的 Python 3:

>>> table = str.maketrans(dict.fromkeys('aeiouAEIOU'))
>>> "Hey look words.translate(table)
'Hy lk wrds'

8
投票

另一种选择是放弃元音变量并将要删除的字符放入循环中。

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

    print anti_vowel("HappIEAOy")

5
投票

你应该这样做:

newstr
初始化为
c
,然后

for x in c.lower():
    if x in vowels:
        newstr = newstr.replace(x, "")

这是因为

str.replace(old, new[, max])
在替换字符后返回字符串的副本:

replace() 方法返回字符串的副本,其中 旧的出现已被新的替换,可选地限制 更换次数达到最大。

所以,这是正确的代码:

def anti_vowel(c):
    newstr = c
    vowels = ('a', 'e', 'i', 'o', 'u')
    for x in c.lower():
        if x in vowels:
            newstr = newstr.replace(x,"")

    return newstr

你也可以用更Pythonic的方式来做:

''.join([x for x in c if x not in vowels])

3
投票
vowels = ('a', 'e', 'i', 'o', 'u', 'A', 'I', 'E', 'O', 'U')

for char in text:

    if char in vowels:

        text = text.replace(char, '')

return text

3
投票

另一种更简单的方法是从字符串中提取非元音字符并返回它们。

def anti_vowel(text):
    newstring=""
    for i in text:
        if i not in "aeiouAEIOU":
            newstring=newstring+i
    text=newstring
    return text

3
投票

我知道这个问题有很多正确的解决方案,但我想添加一些有趣的方法来解决这个问题。 如果您来自 C++/C# 或 Java,您将倾向于使用诸如比较然后操作之类的操作,使用索引来删除 for 循环中不需要的条目。 Python有Remove和Del函数。删除函数使用值和 del 使用索引。Pythonic 解决方案在最后一个函数中。让我们看看如何做到这一点:

这里我们在 for 循环和 del 函数中使用索引,这与 C++ 中非常相似:

def remove_vol(str1):
     #list2 = list1 # this won't work bc list1 is the same as list2 meaning same container#
    list1 = list(str1)
    list2 = list(str1)
    for i in range(len(list1)):
        if list1[i] in volwes:
            vol = list1[i]
            x = list2.index(vol)
            del list2[x]
    print(list2)

使用删除功能:

def remove_vol(str1): 
      list1 = list(str1)
      list2 = list(str1)
      for i in list1:
          if i in volwes:
              list2.remove(i)
      print(list2)

使用索引构建不包含不需要的字符的新字符串:

def remove_vol(str1):  
    list1 = list(str1)
    clean_str = ''
    for i in range(len(list1)):
        if list1[i] not in volwes:
            clean_str += ''.join(list1[i])
    print(clean_str)

与上面的解决方案相同,但使用值:

def remove_vol(str1):
    list1 = list(str1)
    clean_str = ''
    for i in list1:
        if i not in volwes:
            clean_str += ''.join(i)
    print(clean_str)

你应该如何在Python中做到这一点?使用列表理解!真漂亮:

def remove_vol(list1):
    clean_str = ''.join([x for x in list1 if x.lower() not in volwes])
    print(clean_str)

2
投票
def anti_vowel(text):
new=[]
vowels = ("aeiouAEIOU")
for i in text:
    if i not in vowels:
        new.append(i)
return ''.join(new)

我希望这有帮助..


2
投票
def anti_vowel(text):
  new_text = ""
  for i in text:
    if i == 'a' or i == 'A':
      pass
    elif i == 'e' or i == 'E':
      pass
    elif i == 'I' or i == 'i':
      pass
    elif i == 'o' or i == 'O':
      pass
    elif i == 'u' or i == 'U':
      pass
    else:
      new_text = new_text + i
  return new_text

print anti_vowel('Hey look Words!')

1
投票

我的实现:


# Ask the user for input:
user_input = input("enter a string with some vowels: ")
print("input string: " + str(user_input))
vowels = ('a','e','i','o','u','A','E','I','O','U')
new_string="";
for i in range(0,len(user_input),1):
    if user_input[i] in vowels:
        print ('found a vowel, removing...')
    else:
        new_string+=user_input[i]
print("I've removed the vowels for you. You're welcome! The new string is: " + new_string)

1
投票

一个相当简单的方法可能是;

def anti_vowel(text):
    t = ''
    for c in text:
        if c in "aeiouAEIOU":
            pass
    else:  
        t += c  
    return t  

1
投票
def anti_vowel(text):
    t=""
    for c in text:
        for i in "ieaouIEAOU":
            if c==i:
                c=""
            else:
                c=c
        t=t+c
    return t
© www.soinside.com 2019 - 2024. All rights reserved.