ホームページ > バックエンド開発 > Python チュートリアル > 反復中にリストを変更するときに、ループが文字列からすべての母音を削除できないのはなぜですか?

反復中にリストを変更するときに、ループが文字列からすべての母音を削除できないのはなぜですか?

DDD
リリース: 2024-12-13 19:56:17
オリジナル
235 人が閲覧しました

Why does my loop fail to remove all vowels from a string when modifying the list during iteration?

一部の項目を削除するための「忘れる」ループ

以下のコードの目的は、指定された文字列から母音を削除する 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート