ホームページ >バックエンド開発 >Python チュートリアル >文字列から母音を削除するときにループで母音がスキップされるのはなぜですか?
ループは反母音関数の特定の削除を無視します
このコードでは、すべての母音を削除する anti_vowel 関数を作成することを目的としています。指定された文字列。ただし、サンプル テキスト「Hey look Words!」でテストすると、「Hy lk Words!」という望ましくない結果が返されます。問題は、削除プロセス中に 2 番目の 'o' が省略されていることにあります。
問題の核心は、リストを反復処理している間にリストを変更していることであり、これにより予期される動作が中断されます。これを解決するには、リストの浅いコピーを作成し、代わりにそれを反復処理します。
より明確に理解するために、ループの開始時に char と textlist を出力するときのループの動作を調べてみましょう。
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!
ご覧のとおり、最初の 'o' を削除した後、リストのインデックスが進んでいるために 2 番目の 'o' をスキップし、意図した内容が省略されます。
これに対処するために、textlist[:] を使用してリストのコピーを作成します。そうすることで、ループが静的リストを反復処理し、不要なスキップを防止します。
さらに、より簡潔な解決策として Python のリスト内包表記を利用できます。
def remove_vowels(text): # An improved function name return ''.join(ch for ch in text if ch.lower() not in 'aeiou')
以上が文字列から母音を削除するときにループで母音がスキップされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。