dict
繰り返しながら変更することはできません。古いものをフィルタリングして新しいものを作成するかdict
、反復するために何らかの一時オブジェクトを作成する必要があります。
(1)dict
フィルタリングされた結果を使用して新しいものを作成します。
dict1 = {k:v for (k, v) in dict1.iteritems() if all('my_string' in e for e in v)}
(2.1)一時的なものを作成しますdict
:
for k, v in dict1.copy():
if all('my_string' in e for e in v):
del dict1[k]
(2.2)list
Key-Valuetuple
の一時的なものを作成します。
for k, v in dict1.items():
if all('my_string' in e for e in v):
del dict1[k]
list
(2.3)キーの一時を作成します。
for k in dict1.keys():
if all('my_string' in e for e in dict1[k]):
del dict1[k]
それで、どのようにそれらの間で決定しますか?
1は、ミューテーションのないコードのすべての利点を備えているため、最も簡単に推論できます。しかし、2.1-2.3は、初心者プログラマーにとってはおそらくもっと簡単です。通常、その区別が最も重要です。
メモリ使用量が心配な場合は、2.3が2.1-2.2よりも優れていることは明らかです。これは、一時オブジェクトがはるかに小さいためです。しかし、2.3対1はどうですか?それは2つのことに依存します:最初に、残りのアイテムだけlist
と比較して、すべてのキーの大きさはどれくらいですか?dict
次に、大きなハッシュテーブルを縮小するのではなく、小さなハッシュテーブルを最初から作成することで、どのくらいのスペースが得られますか?Pythonはハッシュテーブルをまったく縮小しないため、通常、後者のメリットはありません…しかし、それが重要な場合は、プラットフォームでユースケースをテストして、何が起こるかを確認する必要があります。
パフォーマンスが心配な場合は、メモリ使用量とよく似ています。2.3対1は明らかな競争相手であり、ほとんどの状況を維持しない限り1の方が優れていますがdict
、重要な場合は、自分で測定する必要があります。
最後に、上記はPython 2.7の場合であり、これは(推測として)使用しているように見えるものであることに注意してください。3.xではitems
、keys
両方とも既存のイテレータを返すため、コピーを明示的に行うdict
必要があります。list(dict1.items())
list(dict1.keys())