辞書から項目を値で削除する場合、つまり項目'のキーが不明な場合には、どのような方法がありますか? ここでは簡単な方法をご紹介します。
for key, item in some_dict.items():
if item is item_to_remove:
del some_dict[key]
もっと良い方法はありますか? 辞書の反復処理中に、辞書から項目を削除することに問題はありませんか?
現在、オブジェクトの同一性をテストしていることに注意してください(is
は、両方のオペランドがメモリ上で同じオブジェクトで表現されている場合にのみTrue
を返しますが、==
で比較される2つのオブジェクトでは必ずしもそうではありません)。もしこれを意図的に行っているのであれば、コードを次のように書き換えてください。
some_dict = {key: value for key, value in some_dict.items()
if value is not value_to_remove}
しかし、これはあなたが望むことをしないかもしれません。
>>> some_dict = {1: "Hello", 2: "Goodbye", 3: "You say yes", 4: "I say no"}
>>> value_to_remove = "You say yes"
>>> some_dict = {key: value for key, value in some_dict.items() if value is not value_to_remove}
>>> some_dict
{1: 'Hello', 2: 'Goodbye', 3: 'You say yes', 4: 'I say no'}
>>> some_dict = {key: value for key, value in some_dict.items() if value != value_to_remove}
>>> some_dict
{1: 'Hello', 2: 'Goodbye', 4: 'I say no'}
ですから、おそらく is not
の代わりに !=
を使いたいのでしょう。
ご提案のように、イテレート中に辞書から項目を削除することは何の問題もありません。 複数のスレッドが同時に同じ辞書を使用すると、KeyErrorなどの問題が発生する可能性があるので注意が必要です。
もちろん、http://docs.python.org/library/stdtypes.html#typesmapping のドキュメントを参照してください。