6

辞書はこのように使用することを意図していないため、これを行うための組み込み関数はありませんが、辞書内の特定の値を持つすべてのエントリを削除する必要があります。

私の辞書が次のようになっている場合:

'NameofEntry1': '0'
'NameofEntry2': 'DNC'
 ...

DNC という値を持つすべてのエントリを削除 (おそらくポップ) する必要があります。辞書には複数あります。

4

4 に答える 4

22

元の辞書を変更する:

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()ます。

于 2013-06-13T19:15:35.440 に答える
9

辞書を繰り返し処理しているときに辞書を変更していないことを確認する必要があるだけです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'}
于 2013-06-13T19:16:31.120 に答える
2

これはうまくいくはずです:

for key, value in dic.items():
     if value == 'DNC':
         dic.pop(key)
于 2013-06-13T19:16:21.523 に答える
0

制限 re: 反復中に辞書を変更することが問題である場合、指定された値を持つすべてのキーの逆インデックスを格納する dict と互換性のある新しいクラスを作成できます (dict アイテムの作成 / 更新 / 削除時に更新されます)。これは、dict の項目を繰り返し処理せずに del の引数にすることができます。

dict をサブクラス化し、 、 、 、および__setitem____delitem__オーバーライドpoppopitemますclear

これが頻繁に実行する操作である場合は、便利で高速な場合があります。

于 2013-06-13T20:22:29.153 に答える