ホームページ >バックエンド開発 >Python チュートリアル >文字列から母音を削除するときにループで母音がスキップされるのはなぜですか?

文字列から母音を削除するときにループで母音がスキップされるのはなぜですか?

DDD
DDDオリジナル
2024-12-12 14:39:10888ブラウズ

Why Does My Loop Skip Vowels When Removing Them From a String?

ループは反母音関数の特定の削除を無視します

このコードでは、すべての母音を削除する 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。