2016-06-16 51 views
0

我正在使用codeacademy python初学者课程。我应该定义一个函数,该函数接受一个字符串,并在没有元音的情况下返回它。我的函数删除了一些元音,但通常不是全部,而是根据特定的字符串而变化,并且没有清晰的图案。我的代码是下面,请过目,看看是否你能找到我的错误:学习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) 

回答

3

你的问题是,你遍历列表letters,并在同一时间进行修改。这会导致迭代跳过输入中的某些字母而不检查它们。

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

为了使代码正常工作,您需要更改其逻辑。要么迭代列表副本,反向迭代,要么创建一个包含所需项目的新列表,而不是删除不需要的项目。

+0

很好的答案!注意最初的文本字符串应该阅读'aex' – Mark

+0

哎呀,是的,我从''aab''切换到''aex'',以使元音之间的区别更加清晰。我编辑修复了'aab'的左边。 – Blckknght

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. 
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 
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的所有黑暗角落,它会产生一个理想的伪代码语言:-)

因为这几乎可以肯定是功课,它的你的工作把它变成你选择的语言。

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

我们初始化函数调用传递PARAM文本

def anti_vowel(text): 

我们将初始化最后一个空字符串

final = '' 

我们将着眼于所有文字把信交给在

for letter in text: 

每次我们这样做,我们将考虑所有可能的元音

 def anti_vowel(text): 

如果这些匹配,我们正在检查这封信,我们将把这信一个空字符串,以摆脱它。

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

一旦我们对每个元音进行了检查,如果它是一个元音,那么它将是一个空字符串。如果不是,它将是一个包含辅音的字符串。我们将这个值加到最后一个字符串上

 final += letter 

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

print final 

返回结果

return final 

通过这项

anti_vowel('AEIOUaeiou qwertyuiopasdfghjklzxcvbnm') 

将返回该

qwrtypsdfghjklzxcvbnm

0

添加到什么休息早已赛d,通过它循环的时候,你不应该修改迭代,这里是我的整个代码的短版:

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

的Python已经有一个“内置的文本卸妆”,你可以阅读更多关于翻译here

相关问题