Es gibt viele nette Antworten, aber ich möchte eines hervorheben.
Sie können sowohl eine dict.pop()
Methode als auch eine allgemeinere del
Anweisung verwenden , um Elemente aus einem Wörterbuch zu entfernen. Beide mutieren das ursprüngliche Wörterbuch, sodass Sie eine Kopie erstellen müssen (siehe Details unten).
Und beide lösen ein aus, KeyError
wenn der Schlüssel, den Sie ihnen zur Verfügung stellen, nicht im Wörterbuch vorhanden ist:
key_to_remove = "c"
d = {"a": 1, "b": 2}
del d[key_to_remove] # Raises `KeyError: 'c'`
und
key_to_remove = "c"
d = {"a": 1, "b": 2}
d.pop(key_to_remove) # Raises `KeyError: 'c'`
Sie müssen sich darum kümmern:
durch Erfassen der Ausnahme:
key_to_remove = "c"
d = {"a": 1, "b": 2}
try:
del d[key_to_remove]
except KeyError as ex:
print("No such key: '%s'" % ex.message)
und
key_to_remove = "c"
d = {"a": 1, "b": 2}
try:
d.pop(key_to_remove)
except KeyError as ex:
print("No such key: '%s'" % ex.message)
durch eine Prüfung:
key_to_remove = "c"
d = {"a": 1, "b": 2}
if key_to_remove in d:
del d[key_to_remove]
und
key_to_remove = "c"
d = {"a": 1, "b": 2}
if key_to_remove in d:
d.pop(key_to_remove)
aber mit pop()
es gibt auch eine viel präzisere Möglichkeit - geben Sie den Standardrückgabewert an:
key_to_remove = "c"
d = {"a": 1, "b": 2}
d.pop(key_to_remove, None) # No `KeyError` here
Sofern Sie pop()
nicht den Wert eines zu entfernenden Schlüssels ermitteln, können Sie alles angeben, was nicht erforderlich ist None
. Es kann jedoch sein, dass die Verwendung del
mit in
Check etwas schneller ist, da es sich pop()
um eine Funktion mit eigenen Komplikationen handelt, die Overhead verursachen. Normalerweise ist dies nicht der Fall, daher ist der pop()
Standardwert gut genug.
Bei der Hauptfrage müssen Sie eine Kopie Ihres Wörterbuchs erstellen, um das ursprüngliche Wörterbuch zu speichern und ein neues zu erstellen, ohne dass der Schlüssel entfernt wird.
Einige andere Leute hier schlagen vor, eine vollständige (tiefe) Kopie mit zu copy.deepcopy()
erstellen, was ein Overkill sein könnte, eine "normale" (flache) Kopie mit copy.copy()
oder dict.copy()
könnte ausreichen. Das Wörterbuch enthält einen Verweis auf das Objekt als Wert für einen Schlüssel. Wenn Sie also einen Schlüssel aus einem Wörterbuch entfernen, wird diese Referenz entfernt und nicht das Objekt, auf das verwiesen wird. Das Objekt selbst kann später vom Garbage Collector automatisch entfernt werden, wenn keine anderen Referenzen im Speicher vorhanden sind. Das Erstellen einer tiefen Kopie erfordert im Vergleich zu einer flachen Kopie mehr Berechnungen. Daher wird die Codeleistung verringert, indem die Kopie erstellt, Speicher verschwendet und dem GC mehr Arbeit zur Verfügung gestellt wird. Manchmal reicht eine flache Kopie aus.
Wenn Sie jedoch veränderbare Objekte als Wörterbuchwerte haben und diese später im zurückgegebenen Wörterbuch ohne den Schlüssel ändern möchten, müssen Sie eine tiefe Kopie erstellen.
Mit flacher Kopie:
def get_dict_wo_key(dictionary, key):
"""Returns a **shallow** copy of the dictionary without a key."""
_dict = dictionary.copy()
_dict.pop(key, None)
return _dict
d = {"a": [1, 2, 3], "b": 2, "c": 3}
key_to_remove = "c"
new_d = get_dict_wo_key(d, key_to_remove)
print(d) # {"a": [1, 2, 3], "b": 2, "c": 3}
print(new_d) # {"a": [1, 2, 3], "b": 2}
new_d["a"].append(100)
print(d) # {"a": [1, 2, 3, 100], "b": 2, "c": 3}
print(new_d) # {"a": [1, 2, 3, 100], "b": 2}
new_d["b"] = 2222
print(d) # {"a": [1, 2, 3, 100], "b": 2, "c": 3}
print(new_d) # {"a": [1, 2, 3, 100], "b": 2222}
Mit tiefer Kopie:
from copy import deepcopy
def get_dict_wo_key(dictionary, key):
"""Returns a **deep** copy of the dictionary without a key."""
_dict = deepcopy(dictionary)
_dict.pop(key, None)
return _dict
d = {"a": [1, 2, 3], "b": 2, "c": 3}
key_to_remove = "c"
new_d = get_dict_wo_key(d, key_to_remove)
print(d) # {"a": [1, 2, 3], "b": 2, "c": 3}
print(new_d) # {"a": [1, 2, 3], "b": 2}
new_d["a"].append(100)
print(d) # {"a": [1, 2, 3], "b": 2, "c": 3}
print(new_d) # {"a": [1, 2, 3, 100], "b": 2}
new_d["b"] = 2222
print(d) # {"a": [1, 2, 3], "b": 2, "c": 3}
print(new_d) # {"a": [1, 2, 3, 100], "b": 2222}