以下のコードの目的は、指定された文字列から母音を削除する anti_vowel という関数を作成することです。この関数は単純そうに見えますが、「Hey look Words!」という文字列を処理するとうまくいかず、「Hy lk Words!」が生成されます。この関数は、誤って "look" の最後の "o" を削除できません。
text = "Hey look Words!" def anti_vowel(text): textlist = list(text) for char in textlist: if char.lower() in 'aeiou': textlist.remove(char) return "".join(textlist) print anti_vowel(text)
この問題は、リストを反復処理する際にリストを変更することに起因します。このアプローチは予期せぬ結果をもたらします。これを修正するには、入力リストのコピーを作成して、後続の要素の位置に影響を与えることなく母音を効率的に削除できるようにする必要があります。
for char in textlist[:]: #shallow copy of the list # etc
より深く理解するには、次のコードを考慮してください。問題:
textlist = ['H', 'e', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] for char in textlist: print(char, textlist)
期待される出力は文字列の縦方向のリストですが、実際の出力はis:
H ['H', 'e', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] e ['H', 'e', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] ['H', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] # ! l ['H', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] o ['H', 'y', ' ', 'l', 'o', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] k ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] # Problem!! ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] W ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] o ['H', 'y', ' ', 'l', 'o', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] d ['H', 'y', ' ', 'l', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] s ['H', 'y', ' ', 'l', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] ! ['H', 'y', ' ', 'l', 'k', ' ', 'W', 'o', 'r', 'd', 's', '!'] Hy lk Words!
ループが進行すると、要素がリストから削除され、次の要素がスキップされます。 「look」の場合、2 番目の「o」はインデックスがそれより先に進んでいるためにスキップされます。その結果、「Words」の最後の「o」が、「look」の代わりに削除されます。
Python のリスト内包表記を利用すると、よりクリーンで簡潔なソリューションが提供されます。
def remove_vowels(text): # function names should start with verbs! :) return ''.join(ch for ch in text if ch.lower() not in 'aeiou')
以上が反復中にリストを変更するときに、ループが文字列からすべての母音を削除できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。