学习Python;我不知道为什么我的功能不正常

时间:2016-06-16 01:29:13

标签: python

我正在使用codeacademy python初学者的课程。我应该定义一个接受字符串并在没有元音的情况下返回它的函数。我的函数删除了一些元音,但通常不是全部,根据特定的字符串而没有明确的模式。我的代码如下,请查看以查看您是否能够找到我的错误:

def anti_vowel(text):
    a = len(text)
    b = 0
    letters = []
    while a > 0:
        letters.append(text[b])
        a -= 1
        b += 1
    for item in letters:
        if item in "aeiouAEIOU":
            letters.remove(item)
    final = ""
    return final.join(letters)

6 个答案:

答案 0 :(得分:3)

您遇到的问题是您在列表letters上进行迭代并同时修改它。这会导致迭代跳过输入中的某些字母而不检查它们。

例如,如果您的text字符串为'aex',则letters列表将变为['a', 'e', 'x']。当您对其进行迭代时,item在第一次传递时将为'a',并且letters.remove('a')将被调用。这会将letters更改为['e', 'x']。但是列表迭代按索引工作,因此下一遍循环不会将item设置为'e',而是设置为下一个索引'x'中的项目,而不是{39}}因为它不是元音而被删除。

要使代码有效,您需要更改其逻辑。迭代列表的副本,反向迭代,或创建包含所需项目的新列表,而不是删除不需要的项目。

答案 1 :(得分:2)

如果你在循环中修改你正在循环的东西,你总会得到意想不到的结果 - 这就解释了为什么你从你的函数中得到奇怪的值。

在你的for循环中,你正在修改你应该循环的对象;改为创建一个新对象。

这是一种方法:

def anti_vowel(text):
   results = []  # This is your new object
   for character in text:  # Loop over each character
      # Convert the character to lower case, and if it is NOT
      # a vowel, add it to return list.
      if not character.lower() in "aeiou":
          results.append(character)
   return ''.join(results) # convert the list back to a string, and return it.

答案 2 :(得分:1)

我认为@Blckknght击中头部。如果我遇到这个问题,我会尝试这样的事情:

def anti_vowel(text):
    no_vowels = ''
    vowels = 'aeiouAEIOU'
    for a in text:
        if a not in vowels:
            no_vowels += a

    return no_vowels

答案 3 :(得分:0)

如果您使用包含连续a个字符(或任何元音)的字符串进行尝试,您会明白原因。

实际的remove调用会修改列表,因此该列表上的迭代器将不再正确。

有许多方法可以解决这个问题,但也许最好的方法是根本不使用该方法。制作一个列表然后你可以在创建一个全新的字符串时删除字符是没有意义的,如下所示:

def anti_vowel (str):
    set ret_str to ""
    for ch as each character in str:
        if ch is not a vowel:
            append ch to ret_str
    return ret_str

顺便说一下,不要误以为是Python,它的意思是伪代码来说明如何做到这一点。只是碰巧,如果你忽略了Python的所有黑暗角落,它就会成为一种理想的伪代码语言: - )

由于这几乎可以肯定是课堂作业,所以将 作业转换为您选择的语言。

答案 4 :(得分:0)

不确定你的函数究竟应该如何工作,因为它有很多错误。我将引导您完成我想出的解决方案。

def anti_vowel(text):

    final = ''

    for letter in text:
        for vowel in 'aeiouAEIOU':
            if (letter == vowel):
                letter = ""
        final += letter

    print final        
    return final
anti_vowel('AEIOUaeiou qwertyuiopasdfghjklzxcvbnm')

我们初始化函数并调用传递的参数文本

def anti_vowel(text):

我们将final初始化为空字符串

    final = ''

我们将查看

中传递的文字中的所有字母
    for letter in text:

每次我们这样做,我们都会看到所有可能的元音

       def anti_vowel(text):

如果其中任何一个与我们正在检查的字母相符,我们会将此字母设为空字符串以摆脱它。

           if (letter == vowel):
               letter = ""

一旦我们针对每个元音检查它,如果它是元音,那么此时它将是一个空字符串。如果不是,它将是一个包含辅音的字符串。我们将此值添加到最终字符串

        final += letter

在所有检查和更换完成后打印结果。

    print final

返回结果

    return final

传递此

anti_vowel('AEIOUaeiou qwertyuiopasdfghjklzxcvbnm')

将返回此

qwrtypsdfghjklzxcvbnm

答案 5 :(得分:0)

添加其他人已经说过的内容,你不应该在循环时修改iterable,这是我整个代码的较短版本:

def anti_vowel(text):
    return text.translate(None, "aeiouAEIOU")

Python已经有了“内置文本移除器”,您可以阅读有关翻译here的更多信息。