686 Stimmen

Umbenennen eines Wörterbuchschlüssels

Gibt es eine Möglichkeit, einen Wörterbuchschlüssel umzubenennen, ohne seinen Wert einem neuen Namen zuzuweisen und den alten Schlüsselnamen zu entfernen, und ohne durch den Schlüssel/Wert im Wörterbuch zu iterieren?

Falls es sich um OrderedDict handelt, können Sie dasselbe tun, während Sie die Position dieses Schlüssels beibehalten.

1178voto

wim Punkte 297608

Für ein normales Wörterbuch können Sie Folgendes verwenden:

mydict[k_neu] = mydict.pop(k_alt)

Dadurch wird das Element ans Ende des Wörterbuchs verschoben, es sei denn, k_neu war bereits vorhanden, in welchem Fall der Wert überschrieben wird.

Für ein Python 3.7+ Wörterbuch, bei dem Sie die Reihenfolge zusätzlich erhalten möchten, ist es am einfachsten, eine vollständig neue Instanz neu aufzubauen. Zum Beispiel die Umbenennung des Schlüssels 2 in 'zwei':

>>> d = {0:0, 1:1, 2:2, 3:3}
>>> {"zwei" if k == 2 else k:v for k,v in d.items()}
{0: 0, 1: 1, 'zwei': 2, 3: 3}

Dasselbe gilt für ein OrderedDict, bei dem Sie keine Wörterbuch-Verständlichkeitssyntax verwenden können, aber Sie können einen Generatorausdruck verwenden:

OrderedDict((k_neu if k == k_alt else k, v) for k, v in od.items())

Das Ändern des Schlüssels selbst, wie in der Frage verlangt, ist unpraktisch, da Schlüssel hashbar sind, was normalerweise bedeutet, dass sie unveränderlich und nicht geändert werden können.

38voto

Wenn Sie einen Check für newkey!=oldkey verwenden, können Sie Folgendes tun:

if newkey!=oldkey:  
    dictionary[newkey] = dictionary[oldkey]
    del dictionary[oldkey]

24voto

Ikbel Punkte 1243

Im Falle der Umbenennung aller Wörterbuchschlüssel:

target_dict = {'k1':'v1', 'k2':'v2', 'k3':'v3'}
new_keys = ['k4','k5','k6']

for key,n_key in zip(target_dict.keys(), new_keys):
    target_dict[n_key] = target_dict.pop(key)

12voto

Ashwini Chaudhary Punkte 231447

Sie können dieses Rezept für OrderedDict von Raymond Hettinger verwenden und es modifizieren, um eine Methode umbenennen hinzuzufügen, aber dies wird eine O(N)-Komplexität sein:

def umbenennen(self, key, neuer_schluessel):
    ind = self._keys.index(key)  # den Index des alten Schlüssels erhalten, O(N)-Operation
    self._keys[ind] = neuer_schluessel    # alten Schlüssel durch neuen Schlüssel in self._keys ersetzen
    self[neuer_schluessel] = self[key]    # den neuen Schlüssel hinzufügen, dieser wird am Ende von self._keys hinzugefügt
    self._keys.pop(-1)           # das letzte Element in self._keys entfernen

Beispiel:

dic = OrderedDict((("a",1),("b",2),("c",3)))
print dic
dic.umbenennen("a","foo")
dic.umbenennen("b","bar")
dic["d"] = 5
dic.umbenennen("d","spam")
for k,v in  dic.items():
    print k,v

Ausgabe:

OrderedDict({'a': 1, 'b': 2, 'c': 3})
foo 1
bar 2
c 3
spam 5

11voto

Uri Goren Punkte 12492

Einige Leute vor mir haben den .pop Trick erwähnt, um einen Schlüssel in einem einzigen Befehl zu löschen und zu erstellen.

Persönlich finde ich die explizitere Implementierung lesbarer:

d = {'a': 1, 'b': 2}
v = d['b']
del d['b']
d['c'] = v

Der obige Code gibt {'a': 1, 'c': 2} zurück

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X