0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pythonの辞書で条件に合致する要素を削除する

Last updated at Posted at 2022-03-16
d = {"a": 1, "b": 0, "c": 1}

上記のような辞書があったとして、値が0である要素のみ削除したいとする。
直感的に以下のコードを書いてみる。

for k, v in d.items():
    if v == 0:
        del d[k]

動かすと、以下のエラーが発生する。

RuntimeError: dictionary changed size during iteration

言っていることは分かるが、納得できなくて狂いそう・・・!(静かなる怒り)
対処法として、辞書と直接紐づかないiterableな変数を用意してfor文を回すことを考える。
具体的には、値が0であるキーのリストでfor文を回す。
ここでリストの内包表記が使えると考えられるが、Python触り始めて半年以上経つのに、
オレにはまだ内包表記が・・・ よく分からんのよ・・・!
@ITの記事が分かりやすかった(小並感)。以下のコードは引用。

some_var = [expression for item in iterable_obj if condition]
some_var = []
for item in iterable_obj:
    if condition:
        some_var.append(expression)

この2つのコードが同じであるとのこと。
後者のコードを今回やりたいことに当てはめると、以下のコードになる。

target_keys = []
for key in d.keys():
    if d[key] == 0:
        target_keys.append(key)

これをリストの内包表記に変換する。

target_keys = [key for key in d.keys() if d[key] == 0]

というわけで、辞書から値が0である要素を削除するためのコードは以下の通り。

for target_key in [key for key in d.keys() if d[key] == 0]:
    del d[target_key]

・・・ヨシ!

追記

3年以上前にほぼ同じことをやっているQiitaの記事がありました。
Python の辞書で条件に一致するキーと値を削除する
ちょっとググれば見つかるのに何で見落としてるんですかね???
一応、あちらの記事が新しい辞書を作成するのに対し、こちらの記事は既存の辞書の要素を削除するという違いはあります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?