辞書はこのように使用することを意図していないため、これを行うための組み込み関数はありませんが、辞書内の特定の値を持つすべてのエントリを削除する必要があります。
私の辞書が次のようになっている場合:
'NameofEntry1': '0'
'NameofEntry2': 'DNC'
...
DNC という値を持つすべてのエントリを削除 (おそらくポップ) する必要があります。辞書には複数あります。
辞書はこのように使用することを意図していないため、これを行うための組み込み関数はありませんが、辞書内の特定の値を持つすべてのエントリを削除する必要があります。
私の辞書が次のようになっている場合:
'NameofEntry1': '0'
'NameofEntry2': 'DNC'
...
DNC という値を持つすべてのエントリを削除 (おそらくポップ) する必要があります。辞書には複数あります。
元の辞書を変更する:
for k,v in your_dict.items():
if v == 'DNC':
del your_dict[k]
または、dict 内包表記を使用して新しい dict を作成します。
your_dict = {k:v for k,v in your_dict.items() if v != 'DNC'}
、およびのドキュメントから:iteritems()
iterkeys()
itervalues()
iteritems()
、iterkeys()
またはを使用itervalues()
して辞書内のエントリを追加または削除すると、 が発生するRuntimeError
か、すべてのエントリの反復処理に失敗する場合があります。
for key in dict:
同じことが通常のループにも当てはまります。
Python 3 では、これは dict.keys()
、 、dict.values()
およびに適用されdict.items()
ます。
辞書を繰り返し処理しているときに辞書を変更していないことを確認する必要があるだけですRuntimeError: dictionary changed size during iteration
。
したがって、キー、値のコピーを反復処理する必要があります ( 2.x または3.xでd
使用するため)。d.items()
list(d.items())
>>> d = {'NameofEntry1': '0', 'NameofEntry2': 'DNC'}
>>> for k,v in d.items():
... if v == 'DNC':
... del d[k]
...
>>> d
{'NameofEntry1': '0'}
これはうまくいくはずです:
for key, value in dic.items():
if value == 'DNC':
dic.pop(key)
制限 re: 反復中に辞書を変更することが問題である場合、指定された値を持つすべてのキーの逆インデックスを格納する dict と互換性のある新しいクラスを作成できます (dict アイテムの作成 / 更新 / 削除時に更新されます)。これは、dict の項目を繰り返し処理せずに del の引数にすることができます。
dict をサブクラス化し、 、 、 、および__setitem__
を__delitem__
オーバーライドpop
しpopitem
ますclear
。
これが頻繁に実行する操作である場合は、便利で高速な場合があります。