2017-05-05 13 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'リストを反復しているため。今では 'index 'が異なっています。新しいリストに要素を追加してみてください。 – 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')) 
関連する問題