Anti_vowel函数不会删除元音

时间:2015-06-26 06:15:59

标签: python python-3.x

def anti_vowel(text):
    upper_vowels = ['A', 'E', 'I', 'O', 'U']
    lower_vowels = ['a', 'e', 'i', 'o', 'u']
    char_list = list(text)
    for char in char_list:
        if char in upper_vowels or char in lower_vowels:
            char_list.remove(char)
    new_word = ''
    for char in char_list:
        new_word += char
    return new_word

如果我通过anti_vowel("Hey look Words!"),我会得到结果'Hy lk Words!''o'中的'Words!'未被删除。

2 个答案:

答案 0 :(得分:3)

正如其他人所说,你在迭代它时修改列表。这不会起作用:列表会在您迭代时改变大小,导致您跳过某些字符。您可以使用列表副本来避免这种情况,但也许可以考虑使用更好的方法。

您可以逐个字符地构建字符串,而不是:

def anti_vowel(text):
    vowels = 'AEIOUaeiou'
    result = []
    for c in text:
        if c not in vowels:
            result.append(c)
    return ''.join(result)

这比原始方法更快,更安全,更短,更容易阅读。

或者,您可以使用Python强大的内置字符串函数来完成此操作:

def anti_vowel(text):
    return text.translate(dict.fromkeys(map(ord, 'aeiouAEIOU')))

这会将文本推送到删除所有元音的转换表中。简单!

答案 1 :(得分:0)

这里发生的事情很少。

  • 永远不要在迭代列表时修改列表。如果你要继续使用你的技术,你可以通过调用list[:]创建一个简单的副本。
  • 使用list comprehension进一步简化代码。

稍微简化代码:

def anti_vowel(text):
    upper_vowels = ['A', 'E', 'I', 'O', 'U']
    lower_vowels = [s.lower() for s in upper_vowels]
    char_list = list(text)
    for char in char_list[:]:
        if char in upper_vowels or char in lower_vowels:
            char_list.remove(char)
    return ''.join(char_list)

如果要简化单个lambda下的所有内容,请使用以下命令:

anti_vowel = lambda text: ''.join([s for s in text if s.upper() not in ['A', 'E', 'I', 'O', 'U']])

您可以像常规函数anti_vowel()一样调用它。其背后的想法如下:

  • 遍历每个角色,采用大写
  • 使用列表推导从这些字符中创建新列表,前提是元音中不存在这些列表。 ([x for x in list]
  • 最后将字符放在一起(''.join([]