質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.32%
DELETE

ファイルシステムからファイル、データベースからレコードを削除することまたはメモリ内のオブジェクトの割り当てを取り消すことをさします。もしくは、HTTPプロトコルのDELETEを指すこともあります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

300閲覧

pythonのdel文で消えない文字があるのですが

kokyo-ai

総合スコア1

DELETE

ファイルシステムからファイル、データベースからレコードを削除することまたはメモリ内のオブジェクトの割り当てを取り消すことをさします。もしくは、HTTPプロトコルのDELETEを指すこともあります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2025/03/03 19:09

実現したいこと

以下のコードを実行すると"a"が一つ消えません。
どうすれば消すことができるでしょうか?

発生している問題・エラーメッセージ

該当のソースコード

python
s=list(input())
for j,i in enumerate(s):
if i=="a" or i=="i" or i=="u" or i=="e" or i=="o":
del s[j]
print(s)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

削除されない要素が出るのは、ループの途中で、ループ対象のリストを変更していることが原因です。

試しに、ご提示のコードに「aac」という文字列を入力した際の動作を追ってみましょう。

  1. 入力された文字列をリストに変換してsに代入してるので、s = ['a', 'a', 'c']となる
  2. sの先頭要素'a'とインデックス0をそれぞれi, jに代入してループ内部が実行され、s = ['a', 'c']となる
  3. sの2番目の要素'c'とインデックス1をそれぞれi, jに代入してループ内部が実行され、s = ['a', 'c']となる

これにより、もともと2番目にあった要素の判定が飛ばされて、消えずに残ってしまうのです。

対象要素をすべて削除する方法ですが、公式のFAQには、内包表記を使う方法などが紹介されています。

python

1s=[i for i in s if not(i=="a" or i=="i" or i=="u" or i=="e" or i=="o")]

どうしてもループとdelを使いたいのであれば、逆順に実行するという方法もあります。

python

1for j,i in reversed(list(enumerate(s))): 2 if i=="a" or i=="i" or i=="u" or i=="e" or i=="o": 3 del s[j]

投稿2025/03/03 21:27

actorbug

総合スコア2479

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokyo-ai

2025/03/07 12:01

回答ありがとうございます。 ベストアンサーは別の方を選ばせていただきましたが、こちらの回答も非常に参考になりました。
guest

0

ベストアンサー

リストや辞書の内容でループしながら、そのループしているリストなどを書き換えることはすべきではありません。通常は予期しない結果が出ます。
例外の例としては、巨大なデータを扱っていてメモリを節欲するために内容見ながら書き換えるようなことをする必要がある場合などですね。その場合も、その言語がどのようにデータを管理しているかを考えながら処理を行なう必要があります。

通常の対応方法はいろいろありますが、質問のように不要なものを削除する場合、必要なものだけ抽出するのように読み替えることで、ループの中でリストを直接変更することを避けられます。

python

1ans = [] 2for i in s: 3 if not(i=="a" or i=="i" or i=="u" or i=="e" or i=="o"): 4 ans.append(i) 5print(i) 6print(ans)

(他の回答の内包表記も同じ考え)

ちなみに、判定で 「 複数のうちのどれか」を書くとき、orでつなぐよりも、「in」を使った方や読みやすくなります。

python

1 if i not in ["a", "i", "u", "e", "o"]:

投稿2025/03/04 01:39

編集2025/03/04 05:02
TakaiY

総合スコア14197

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokyo-ai

2025/03/07 11:59

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.32%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問