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.

5voto

Shishir Punkte 319

Angenommen, Sie möchten den Schlüssel k3 in k4 umbenennen:

temp_dict = {'k1':'v1', 'k2':'v2', 'k3':'v3'}
temp_dict['k4']= temp_dict.pop('k3')

4voto

helloswift123 Punkte 123

Andere Antworten sind ziemlich gut. Aber in Python3.6 hat ein gewöhnliches Wörterbuch auch eine Reihenfolge. Es ist also schwer, die Position des Schlüssels im normalen Fall zu behalten.

def umbenennen(altes_dict, alten_namen, neuen_namen):
    neues_dict = {}
    for key, value in zip(altes_dict.keys(), altes_dict.values()):
        new_key = key if key != alten_namen else neuen_namen
        neues_dict[new_key] = altes_dict[key]
    return neues_dict

4voto

KeithWM Punkte 1295

Im Falle von Python 3.6 (und später?) würde ich folgende Einzeiler verwenden

test = {'a': 1, 'old': 2, 'c': 3}
old_k = 'old'
new_k = 'new'
new_v = 4  # optional

print(dict((new_k, new_v) if k == old_k else (k, v) for k, v in test.items()))

was folgendes ergibt

{'a': 1, 'new': 4, 'c': 3}

Es ist möglicherweise erwähnenswert, dass ohne die print-Anweisung die ipython-Konsole/das Jupyter-Notebook das Wörterbuch in einer von ihnen gewählten Reihenfolge präsentiert...

3voto

Sirmione Punkte 281

Wenn jemand alle Schlüssel gleichzeitig umbenennen möchte, indem er eine Liste mit den neuen Namen angibt:

def rename_keys(dict_, new_keys):
    """
     new_keys: Typ List(), muss der Länge von dict_ entsprechen
    """

    # dict_ = {oldK: value}
    # d1={oldK:newK,} mappt alte Schlüssel auf die neuen:  
    d1 = dict(zip(list(dict_.keys()), new_keys))

          # d1{oldK} == new_key 
    return {d1[oldK]: value for oldK, value in dict_.items()}

1voto

excyberlabber Punkte 589

Ich benutze die Antwort von @wim oben, mit dict.pop(), um Schlüssel umzubenennen, aber ich fand einen Fallstrick. Wenn ich das Dictionary durchlaufe, um die Schlüssel zu ändern, ohne die Liste der alten Schlüssel vollständig vom Dictionary-Objekt zu trennen, führte dies dazu, dass neue, geänderte Schlüssel in die Schleife eingefügt wurden und einige vorhandene Schlüssel fehlten.

Zu Beginn habe ich es folgendermaßen gemacht:

für current_key in my_dict:
    new_key = current_key.replace(':','_')
    fixed_metadata[new_key] = fixed_metadata.pop(current_key)

Ich stellte fest, dass das Durchlaufen des Dictionary auf diese Weise dazu führte, dass das Dictionary auch Schlüssel fand, wenn es nicht sollte, d.h. die neuen Schlüssel, die ich geändert hatte! Ich musste die Instanzen vollständig voneinander trennen, um (a) zu verhindern, dass meine eigenen geänderten Schlüssel in der Schleife gefunden wurden, und (b) einige Schlüssel zu finden, die aus irgendeinem Grund innerhalb der Schleife nicht gefunden wurden.

Ich mache das jetzt so:

current_keys = list(my_dict.keys())
für current_key in current_keys:
    und so weiter...

Es war notwendig, die my_dict.keys() in eine Liste umzuwandeln, um die Referenz auf das sich ändernde Dictionary loszuwerden. Wenn ich einfach nur my_dict.keys() benutzte, war ich an die ursprüngliche Instanz gebunden, mit den seltsamen Nebeneffekten.

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