正确的代码,用于从Python中的字符串中删除元音

时间:2014-02-05 15:48:15

标签: python

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

输入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

13 个答案:

答案 0 :(得分:14)

函数str.replace(old, new[, max])不会更改c字符串本身(wrt到你调用的c)只返回一个新字符串,其中旧的字符串已被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]);

我正在做的是迭代字符串,如果一个字母不是元音,那么只将它包含在列表中(过滤器)。过滤后,我将列表作为字符串加入。

答案 1 :(得分:8)

为什么不用regexp来做?根据{{​​3}},这样的事情应该有效:

import re

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

如果您经常使用该功能,则可以编译正则表达式并使用编译版本。

答案 2 :(得分:6)

尝试使用String.translate。

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

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

     

删除deletechars中的所有字符(如果存在),然后使用table翻译字符,该表必须是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'

答案 3 :(得分:4)

你应该这样做:

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

答案 4 :(得分:4)

另一个选择是放弃元音变量并将字符串放在循环中。

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

    print anti_vowel("HappIEAOy")

答案 5 :(得分:2)

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

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

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

我希望这会有所帮助..

答案 8 :(得分:1)

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

答案 9 :(得分:0)

我知道在这个问题上有很多正确的解决方案,但我想添加一些有趣的方法来解决这个问题。 如果您来自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)

答案 10 :(得分:0)

我的实施:

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

答案 11 :(得分:0)

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

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

答案 12 :(得分:0)

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