Frage Löschen Sie ein Element aus einem Wörterbuch


Gibt es eine Möglichkeit, ein Element aus einem Wörterbuch in Python zu löschen?

Außerdem, wie kann ich ein Element aus einem Wörterbuch löschen, um eine Kopie zurückzugeben (d. H. Das Original nicht zu ändern)?


842
2018-04-30 21:20


Ursprung


Antworten:


Das del Erklärung Entfernt ein Element:

del d[key]

Dies ändert jedoch das vorhandene Wörterbuch, sodass sich der Inhalt des Wörterbuchs für jeden ändert, der einen Verweis auf dieselbe Instanz hat. Zurückgeben eines Neu Wörterbuch, mache eine Kopie des Wörterbuchs:

def removekey(d, key):
    r = dict(d)
    del r[key]
    return r

Das dict() Konstruktor macht a flache Kopie. Um eine tiefe Kopie zu erstellen, siehe copy Modul.


Beachten Sie, dass Sie für jedes Diktat eine Kopie erstellen del/ Zuordnung / etc. bedeutet, dass Sie von konstanter Zeit zu linearer Zeit wechseln und auch linearen Raum verwenden. Für kleine Diktate ist das kein Problem. Aber wenn Sie planen, viele Kopien von großen Diktaten zu machen, wollen Sie wahrscheinlich eine andere Datenstruktur, wie ein HAMT (wie beschrieben in diese Antwort).


1184
2018-04-30 21:25



pop mutiert das Wörterbuch.

 >>>lol = {"hello":"gdbye"}
 >>>lol.pop("hello")
    'gdbye'
 >>> lol
     {}

Wenn Sie das Original behalten möchten, können Sie es einfach kopieren.


130
2018-03-21 16:22



Ich denke, Ihre Lösung ist der beste Weg, dies zu tun. Wenn Sie jedoch eine andere Lösung wünschen, können Sie ein neues Wörterbuch erstellen, indem Sie die Schlüssel aus dem alten Wörterbuch verwenden, ohne Ihren angegebenen Schlüssel wie folgt einzuschließen:

>>> a
{0: 'zero', 1: 'one', 2: 'two', 3: 'three'}
>>> {i:a[i] for i in a if i!=0}
{1: 'one', 2: 'two', 3: 'three'}

55
2018-04-30 21:26



Das del Aussage ist was du suchst. Wenn Sie ein Wörterbuch namens foo mit einem Schlüssel namens 'bar' haben, können Sie 'bar' von foo folgendermaßen löschen:

del foo['bar']

Beachten Sie, dass dadurch das verwendete Wörterbuch permanent geändert wird. Wenn Sie das ursprüngliche Wörterbuch behalten möchten, müssen Sie zuvor eine Kopie erstellen:

>>> foo = {'bar': 'baz'}
>>> fu = dict(foo)
>>> del foo['bar']
>>> print foo
{}
>>> print fu
{'bar': 'baz'}

Das dict Anruf macht eine flache Kopie. Wenn Sie eine tiefe Kopie möchten, verwenden Sie copy.deepcopy.

Hier ist eine Methode, die Sie für Ihre Bequemlichkeit kopieren und einfügen können:

def minus_key(key, dictionary):
    shallow_copy = dict(dictionary)
    del shallow_copy[key]
    return shallow_copy

47
2018-04-30 21:23



d = {1: 2, '2': 3, 5: 7}
del d[5]
print 'd = ', d

Ergebnis: d = {1: 2, '2': 3}


16
2018-04-30 21:24



Es gibt viele nette Antworten, aber ich möchte eine Sache hervorheben.

Sie können beide verwenden dict.pop() Methode und eine generische del Erklärung um Elemente aus einem Wörterbuch zu entfernen. Sie mutieren beide das ursprüngliche Wörterbuch, also müssen Sie eine Kopie erstellen (siehe Details unten).

Und beide werden eine erhöhen KeyError Wenn der Schlüssel, den Sie ihnen geben, 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'`

Du musst dich 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 einen Check:

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ägnantere Möglichkeit - geben Sie den Standard-Rückgabewert an:

key_to_remove = "c"
d = {"a": 1, "b": 2}
d.pop(key_to_remove, None)  # No `KeyError` here

Es sei denn du verwendest pop() Um den Wert eines Schlüssels zu erhalten, der entfernt wird, können Sie alles bereitstellen, was nicht notwendig ist None. Obwohl es das verwenden könnte del mit in Scheck ist leicht schneller wegen pop() eine Funktion mit eigenen Komplikationen zu sein, die Overhead verursachen. Normalerweise ist das nicht der Fall pop() mit Standardwert ist gut genug.


Was die Hauptfrage betrifft, 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 schlagen vor, eine vollständige (tiefe) Kopie mit zu machen copy.deepcopy(), die ein Overkill, eine "normale" (seichte) Kopie, sein könnte copy.copy() oder dict.copy(), könnte genug sein. 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, nicht das Objekt, auf das verwiesen wird. Das Objekt selbst kann später automatisch vom Garbage Collector entfernt werden, wenn es keine anderen Referenzen im Speicher gibt. Das Erstellen einer tiefen Kopie erfordert mehr Berechnungen im Vergleich zur flachen Kopie, sodass die Code-Leistung verringert wird, indem die Kopie erstellt wird, Speicher verschwendet wird und dem GC mehr Arbeit geboten wird. Manchmal reicht eine flache Kopie aus.

Wenn Sie jedoch veränderbare Objekte als Wörterbuchwerte haben und planen, sie später im zurückgegebenen Wörterbuch ohne den Schlüssel zu ändern, müssen Sie eine tiefe Kopie erstellen.

Mit seichter 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}

16
2017-09-21 19:52



Rufen Sie einfach del d ['key'] an.

In der Produktion ist es jedoch immer eine gute Methode, zu überprüfen, ob in d ein Schlüssel vorhanden ist.

if 'key' in d:
    del d['key']

12
2018-03-02 13:39



Nein, es gibt keinen anderen Weg als

def dictMinus(dct, val):
   copy = dct.copy()
   del copy[val]
   return copy

Es ist jedoch wahrscheinlich keine gute Idee, Kopien von nur geringfügig geänderten Wörterbüchern zu erstellen, da dies zu relativ großen Speicheranforderungen führen wird. Es ist normalerweise besser, das alte Wörterbuch zu protokollieren (wenn es nötig ist) und es dann zu ändern.


6
2018-04-30 21:27



>>> def delete_key(dict, key):
...     del dict[key]
...     return dict
... 
>>> test_dict = {'one': 1, 'two' : 2}
>>> print delete_key(test_dict, 'two')
{'one': 1}
>>>

Es wird keine Fehlerbehandlung durchgeführt, es wird davon ausgegangen, dass der Schlüssel im Diktat enthalten ist raise wenn es nicht ist


5
2018-04-30 21:26