2017-05-05 236 views
0

我正在編寫一個從單詞中刪除所有元音的函數。它看起來像這樣:Python for循環沒有循環遍歷所有項目

def remove_vowels(word): 

    vowels = ['a', 'e', 'i', 'o', 'u'] 

    word = list(word) 

    for letter in word: 
     print('Looking for letter {}'.format(letter)) 

     if letter.lower() in vowels: 
      try: 
       word.remove(letter) 
      except ValueError: 
       pass 

    return ''.join(word) 

我希望它通過所有的字母在單詞,檢查每個字母如果是元音陣列中,如果是這樣,將其刪除。

但是,它似乎並沒有檢查所有字母。例如,對於下面的調用:

print(remove_vowels('perception')) 

我得到以下輸出:

Looking for letter p 
Looking for letter e 
Looking for letter c 
Looking for letter e 
Looking for letter t 
Looking for letter i 
Looking for letter n 
prcpton 

出於某種原因,它跳過r,第二po。我用其他詞語得到了類似的結果。這是爲什麼發生?

+2

因爲'word.remove(字母)'刪除元音和你迭代相同'word'名單。現在他們有不同的'索引'。嘗試將元素添加到新列表。 – sinsuren

+0

[迭代時從列表中刪除項目]可能的重複(http://stackoverflow.com/questions/1207406/remove-items-from-a-list-while-iterating) – McGrady

回答

2

之所以說它在您的for循環期間沒有工作,您正在變異word,這意味着每當您刪除某些內容時都會跳過迭代,因爲刪除會導致每個字母向上移動一個位置。這意味着如果在位置2處有刪除,那麼下一個項目現在位於位置2,並且後面的項目位於位置3,這是下一次迭代的位置。

def remove_vowels(word): 

    vowels = ['a', 'e', 'i', 'o', 'u'] 

    word = list(word) 
    print(word) 
    new_word = [] 

    for letter in word: 
     print('Looking for letter {}'.format(letter)) 

     if letter.lower() not in vowels: 
      try: 
       new_word.append(letter) 
      except ValueError: 
       pass 

    return ''.join(new_word) 

print(remove_vowels('perception')) 
0
def remove_vowels(word): 

    vowels = ['a', 'e', 'i', 'o', 'u'] 

    word = list(word) 
    result = list() 
    for letter in word: 
     print('Looking for letter {}'.format(letter)) 

     if letter.lower() not in vowels: 
      try: 
       result.append(letter) 
      except ValueError: 
       pass 

    return ''.join(result) 


print(remove_vowels('perception')) 
1

正如評論中提到的那樣,處理正在迭代的元素通常很麻煩。這個怎麼樣:

代碼:

def remove_vowels(word): 
    vowels = set('aeiou') 
    return ''.join(l for l in word if l not in vowels) 

測試代碼:

print(remove_vowels('perception')) 

結果:

prcptn 
+0

哇,這很簡潔。但我只是學習Python,所以我會堅持更容易閱讀解決方案。 –

+0

@IgorSkoldin,感謝您的反饋,是的,您一定要隨心所欲。不過,我衷心的推薦,以及我在初學者帖子上發佈這些解決方案的原因是,您花時間學習這種語法。它不像最初看起來那樣艱難,而且它是非常強大的。歡呼聲,祝你好運。 –

0
def remove_vowels(word): 

vowels = ['a', 'e', 'i', 'o', 'u'] 

word = list(word) 
word_new = [] 
for letter in word: 
    print('Looking for letter {}'.format(letter)) 
    if letter.lower() in vowels: 
     continue 
    else: 
     word_new.append(letter) 

return ''.join(word_new) 
print(remove_vowels('perception'))