キネマティックオブジェクトのインスタンスを含む辞書があるとします。各キネマティックオブジェクトは、位置、速度などを持っています。プログラムの各タイムステップ更新時に、2つのアクティブオブジェクト(同じオブジェクトではないことを意識して)が参照フレーム内の同じ位置を占めるかどうかを確認します。そうした場合、これは衝突をシミュレートし、関連する2つのオブジェクトが破棄され、そのインスタンスがアクティブオブジェクト辞書から削除されます。キー(およびオブジェクト)の活性物質から除去されるが、for
ループの条件はこれを認識し、KeyError例外が発生します失敗:。私はdel
を使用することはできません辞書から項目を削除するアプリケーション
dict actives{ 'missile' : object_c(x1, y1, z1),
'target' : object_c(x2, y2, z2),
'clutter' : object_c(x3, y3, z3),
... }
...
for key1 in self.actives.keys():
for key2 in self.actives.keys():
if not key1 == key2:
# Get Inertial Positions and Distance
Pos21 = self.actives[key2].Pos - self.actives[key1].Pos
distance = math.sqrt(sum(Pos21**2))
# If Distance <= Critical Distance
if distance <= 1.0e0
# Remove key1 and key2 from Actives
# -- This is where I need help --
ループ条件のキーにアクセスしている間に、これらのオブジェクトをアクティブから削除するにはどうすればよいですか?
ことほぼ正しいと思われますが、適切な条件の下で、 'to_be_removed'リストは、2つの他のオブジェクトと同じ場所を占めるならば、' key1'の複数のインスタンスを持つことができます(すなわち、key1とkey2の間の距離は0.5、key1とkey3の間の距離0.75である)。同じキーのコピーをリストに入れると、 'pop'にKeyErrorが発生します。しかし、おそらく、辞書からポップする前に 'to_be_removed'リストを記録し、それをクリーンアップして(重複したキーを削除する)ことができます。 –
@ S.Gamgee: 'default'値(この場合は' None')を指定すると、リストからキーを削除するとエラーは発生しません。 https://docs.python.org/3.5/library/stdtypes.html –