2016-05-23 8 views
-1

母音を文字列から削除するCodecademyのプログラムを作成しました。私は理解できない何らかの理由で、正しく動作していません。ここに私のコードは次のとおりです。Python母音リムーバー

def anti_vowel(text): 
    wordcontents=list(text) 
    vowel=['a','e','i','o','u'] 
    for letter in wordcontents: 
     if letter in vowel: 
      wordcontents.remove(letter) 
    word='' 
    word=word.join(wordcontents) 
    return word 

anti_vowel("Hey Look Words!") 

結果と:

"Hy lk Words!" 

任意の洞察力?私の間違いは何ですか?

+1

問題は、コレクションを繰り返し処理していて、同時にコレクションを削除してもうまくいかないことです。代わりに、最初のものを反復するときに新しいリストを作成します。 –

答えて

2
def anti_vowel(text): 
    vowel= 'aeiou' 
    return ''.join(c for c in text if c not in vowel) 
+1

これを短くするには: 'wordcontents'を使わないでください。関数の最初の行を削除することができます。' vowel = 'aeiou'を使うことができます。最後のこと:あなたは 'join'のパラメータとしてリストを必要としません。角括弧を削除し、代わりにジェネレータを使用します。 – Matthias

+0

@Matthiasありがとうございました。私は質問からペーストをコピーします。私は大括弧なしで動作するかどうかはわかりませんでした。毎日何か新しいことを学ぶ。 – Sorin

0

Alex Hallのコメントは正しいです。

何が起こっているのかは、「見て」で2番目の「o」をスキップして、「単語」で見つけたら削除します。アイテムを削除している間に文字列を反復処理する方法は、文字をスキップすることになります。連続して2つの母音に達するまでは問題ありません。

問題を攻撃するために私が意味する

print "checking " + letter + " in " + ''.join(wordcontents): 

より良い方法は、母音のリストを反復処理し、その母音まで文字列から母音を削除しておくことであろうかを見るために右のあなたのループの後にprint文を入れてもはや文字列に現れません。

removeは、リストを横断して、指定されたオブジェクトの最初のインスタンスを削除します。

[ 1, 2, 3, 1].remove(1) #this removes just the first instance of 1 

リストでremove(1)を再度呼び出すと、最後の番号が削除されます。

もう一度呼び出すと例外がスローされます。あなたは

このような
while 'a' in wordcontents: 
    wordcontents.remove('a') 

何かをする場合は、リストには複数のインスタンスが存在しなくなるまで

これは、remove関数を呼び出し続けます。

関連する問題