反u元音功能不起作用

2024-04-26 23:21:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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!''Words!'中的'o'未被移除。你知道吗


Tags: textinnewforifdefupperlower
2条回答

正如其他人所注意到的,您在迭代列表时正在修改它。这是行不通的:当您迭代时,列表会改变大小,导致您跳过一些字符。您可以使用列表副本来避免这种情况,但是可以考虑使用更好的方法。你知道吗

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

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

这将文本推入一个删除所有元音的翻译表。容易的!你知道吗

这里发生的事情很少。你知道吗

  • 在遍历列表时不要修改列表。如果您想继续使用您的技术,您可以通过调用list[:]来创建一个简单的副本。你知道吗
  • 使用列表理解来进一步简化代码。你知道吗

稍微简化一下代码:

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([]

相关问题 更多 >