値によってディクショナリからアイテムを削除する最良の方法は何ですか。つまり、アイテムのキーが不明な場合。ここに簡単なアプローチがあります:
for key, item in some_dict.items():
if item is item_to_remove:
del some_dict[key]
もっと良い方法はありますか?ディクショナリの反復中にディクショナリから変更(アイテムを削除)することに問題はありますか?
値によってディクショナリからアイテムを削除する最良の方法は何ですか。つまり、アイテムのキーが不明な場合。ここに簡単なアプローチがあります:
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
。
some_dict.iteritems()
、ここでとプットfor
とif
読みやすさのために別の行に文
iteritems
今はitems
です。Python 2.7では、iteritems()
本当に優れています。
a = {'name': 'your_name','class': 4}
if 'name' in a: del a['name']
delとpop()の簡単な比較:
import timeit
code = """
results = {'A': 1, 'B': 2, 'C': 3}
del results['A']
del results['B']
"""
print timeit.timeit(code, number=100000)
code = """
results = {'A': 1, 'B': 2, 'C': 3}
results.pop('A')
results.pop('B')
"""
print timeit.timeit(code, number=100000)
結果:
0.0329667857143
0.0451040902256
したがって、delはpop()よりも高速です。
pop()
(@ n-1-1が上記のように)2番目の引数を指定できますdel
。これは、演算子のオプションではありません。
timeit
。この明確な例をありがとう。
削除が必要なキーのリストを作成してから削除します。シンプルで効率的であり、dictの反復と変更を同時に行うことによる問題を回避します。
keys_to_remove = [key for key, value in some_dict.iteritems()
if value == value_to_remove]
for key in keys_to_remove:
del some_dict[key]
cは新しい辞書、aは元の辞書、{'z'、 'w'}はaから削除するキーです
c = {key:a[key] for key in a.keys() - {'z', 'w'}}
また、https://www.safaribooksonline.com/library/view/python-cookbook-3rd/9781449357337/ch01.htmlも確認してください。
y={'username':'admin','machine':['a','b','c']}
if 'c' in y['machine'] : del y['machine'][y['machine'].index('c')]
あなたが提案したように、反復中にディクショナリからアイテムを削除することに問題はありません。同時に同じディクショナリを使用する複数のスレッドに注意してください。これにより、KeyErrorまたはその他の問題が発生する可能性があります。
もちろん、http: //docs.python.org/library/stdtypes.html#typesmappingにあるドキュメントを参照してください
for k,v in d.iteritems(): del d[k]
与えるだろうRuntimeError: dictionary changed size during iteration
。ミトランディの説明を参照してください。