ループが一部の項目を削除するのを「忘れる」 [重複] [重複
2023-08-02 14:02:47
質問
このコードでは、私は文字列からすべての母音(aeiouAEIOU)を削除する関数anti_vowelを作成しようとしています。私はそれを考える べきである はうまくいくはずですが、私がそれを実行すると、サンプルテキスト "Hey look Words!" は "Hy lk Words!" として返されます。最後の'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
あなたが見ている動作を明確にするために、これをチェックしてみてください。プット
print 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!
で、どうなってるんだ?素敵な
for x in y
ループは実際には単なる構文上の糖分です:それはまだインデックスによってリスト要素にアクセスします。そのため、反復処理中にリストの要素を削除すると、(上で見たように)値をスキップするようになります。その結果、2番目の
o
で
"look"
というのは、前の要素を削除したときに、インデックスがそれを越えて進んでしまったからです。そして
o
で
"Words"
を削除する場合、最初に現れる
'o'
を削除します。
他の人が言及したように、リスト内包はおそらくこれを行うためのさらに良い(よりきれいで、より明確な)方法でしょう。Pythonの文字列が反復可能であるという事実を利用します。
def remove_vowels(text): # function names should start with verbs! :)
return ''.join(ch for ch in text if ch.lower() not in 'aeiou')
関連
-
[解決済み】空の配列要素を削除する
-
[解決済み] Pythonの辞書からキーを削除するにはどうしたらいいですか?
-
[解決済み] インデックスを指定してリストから要素を削除する方法
-
[解決済み] リストにおけるdel、remove、popの違いについて
-
[解決済み] リストから最初の項目を削除するには?
-
[解決済み] 反復処理中にリストから項目を削除するには?
-
[解決済み] リスト内の項目を1つの文字列に連結するには?
-
[解決済み] 文字列の一覧から空の文字列を削除する
-
[解決済み] ある文字列が文字列のリストの項目の部分文字列であるかどうかを確認する方法は?
-
[解決済み] tensorflowのCPUのみのインストールでダイナミックライブラリ 'cudart64_101.dll' を読み込めなかった
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pandasのデータフレームでタプルの列を分割するにはどうしたらいいですか?
-
[解決済み] 2つの線分が交差しているかどうかを確認するにはどうすればよいですか?
-
[解決済み] SQLAlchemy: セッションの作成と再利用
-
[解決済み] PythonでファイルのMD5チェックサムを計算するには?重複
-
[解決済み] Django のテストデータベースをメモリ上だけで動作させるには?
-
[解決済み] Pythonの要素別タプル演算(sumなど
-
[解決済み] なぜ(0-6)は-6=偽なのか?重複
-
[解決済み] DataFrameに日付間の日数カラムを追加する pandas
-
[解決済み] 値で列挙名を取得する [重複]。
-
[解決済み] pipの依存性/必要条件をリストアップする方法はありますか?