Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで辞書を反復処理しながら要素を削除する3つの方法

Pythonの辞書(dict)は、キーと値のペアを格納できる変更可能なコレクションであり、各要素はキーを使って参照します。この記事では、辞書を反復処理しながら要素を削除するための複数の方法を、具体的なサンプルコードと実行結果とともに解説します。

del文とキーを使う方法

このアプローチでは、まず削除対象となるキーをリスト内包表記で抽出し、その後del文を適用して該当するキーと値のペアをまとめて削除します。

サンプルコード

# 対象の辞書
ADict = {1: 'Mon', 2: 'Tue', 3: 'Wed', 4: 'Thu', 5: 'Fri'}

# キーが2または3の要素を削除対象として取得
to_del = [key for key in ADict if key in (2, 3)]

# キーを削除
for key in to_del:
    del ADict[key]

# 処理後の辞書
print(ADict)

実行結果

{1: 'Mon', 4: 'Thu', 5: 'Fri'}

list()でキーをリスト化して使う方法

辞書をそのままforループで回しながら要素を削除するとエラーが発生しますが、list()でキーのリストを事前に作成しておけば安全に削除できます。以下の例では、2で割った余りが0になる偶数のキーのみを削除対象としています。

サンプルコード

# 対象の辞書
ADict = {1: 'Mon', 2: 'Tue', 3: 'Wed', 4: 'Thu', 5: 'Fri'}

# 偶数のキーを持つ要素を削除
for key in list(ADict):
    if (key % 2) == 0:
        del ADict[key]

# 処理後の辞書
print(ADict)

実行結果

{1: 'Mon', 3: 'Wed', 5: 'Fri'}

items()を使って削除する方法

キーだけでなく、items()メソッドで取得したキーと値のペアをもとに削除対象を選ぶこともできます。値の条件で絞り込んだうえで、対応するキーを経由して要素を削除します。

サンプルコード

# 対象の辞書
ADict = {1: 'Mon', 2: 'Tue', 3: 'Wed', 4: 'Thu', 5: 'Fri'}

NewDict = []
# 値が'Tue'または'Fri'であるキーを取得
for key, val in ADict.items():
    if val in ('Tue', 'Fri'):
        NewDict.append(key)

# 該当するキーの要素を削除
for i in NewDict:
    del ADict[i]

# 処理後の辞書
print(ADict)

実行結果

{1: 'Mon', 3: 'Wed', 4: 'Thu'}

まとめ

辞書を反復処理中に直接要素を削除すると「RuntimeError: dictionary changed size during iteration」が発生するため、削除対象のキーを事前にリストなどへ退避させてから削除するのが基本です。状況に応じてdel文・list()・items()を使い分けることで、安全かつ柔軟に辞書の要素を操作できます。

  1. Pythonで辞書をキー順に並べ替える方法【OrderedDictとsorted()の使い方】

    Pythonで辞書(dict)の要素をキーの順序に従って並べ替えたい場面はよくあります。この記事では、標準ライブラリのcollectionsモジュールに含まれるOrderedDictと、組み込み関数sorted()を組み合わせて、辞書をキー順にソートする方法を解説します。 OrderedDictとは Pythonの標準ディストリビューションには、高性能なコンテナデータ型を定義したcollectionsモジュールが含まれています。その中のOrderedDictは、辞書のサブクラスであり、要素が追加された順序を記憶する特徴を持っています。OrderedDictをイテレートすると、キーが最初に追加さ

  2. Pythonで文字列から子音を削除する方法をわかりやすく解説

    Pythonで文字列から子音を取り除きたい場合、最も手軽なのは正規表現(reモジュール)を使う方法です。この記事では、正規表現による削除方法を中心に、目的別のいくつかのアプローチをコード例とともに紹介します。 1. 正規表現のre.sub()で子音を削除する 複数の子音を「|」(OR条件)で連結してパターンを作り、re.sub(置換対象パターン, 置換後の文字列, 対象文字列)を呼び出すだけで、該当する文字を一括で除去できます。flags=re.IGNORECASEを指定すれば、大文字・小文字を区別せずに処理できます。 >>> import re >>>