Gibt es eine Möglichkeit, einen Wörterbuchschlüssel umzubenennen, ohne seinen Wert einem neuen Namen zuzuweisen und den alten Namensschlüssel zu entfernen? und ohne durch diktschlüssel / wert zu iterieren?
Im Fall von OrderedDict machen Sie dasselbe, während Sie die Position dieses Schlüssels beibehalten.
python
dictionary
associative-array
ordereddictionary
rabin utam
quelle
quelle
OrderedDict
. Diktate ignorieren die Reihenfolge, wenn sie auf Gleichheit verglichen werden, währendOrderedDict
die Reihenfolge beim Vergleich berücksichtigt wird. Ich weiß, dass Sie mit etwas verlinkt sind, das es erklärt, aber ich dachte, Ihr Kommentar hätte diejenigen irregeführt, die diesen Link möglicherweise nicht gelesen haben.OrderedDict
beim Vergleich die Ordnung berücksichtigt wird" Ok, aber niemand kümmert sich nach 3.7. Ich behaupte, esOrderedDict
ist weitgehend veraltet. Können Sie Gründe nennen, warum dies nicht der Fall ist? zB hier ist nicht überzeugend, es sei denn, Sie brauchenreversed()
Antworten:
Für ein reguläres Diktat können Sie Folgendes verwenden:
Ich denke, für ein OrderedDict müssen Sie ein völlig neues mit einem Verständnis erstellen.
Das Ändern des Schlüssels selbst, wie diese Frage zu stellen scheint, ist unpraktisch, da Diktierschlüssel normalerweise unveränderliche Objekte wie Zahlen, Zeichenfolgen oder Tupel sind. Anstatt zu versuchen, den Schlüssel zu ändern, können Sie den "Umbenennen" in Python erreichen, indem Sie den Wert einem neuen Schlüssel zuweisen und den alten Schlüssel entfernen.
quelle
dict.pop
es für ein OrderedDict basierend auf meinem Test funktioniert.OrderedDict
die Einfügereihenfolge bleibt erhalten, worüber die Frage nicht gestellt wurde.beste Methode in 1 Zeile:
quelle
d = {('test', 'foo'):[0,1,2]}
?d[('new', 'key')] = d.pop(('test', 'foo'))
Mit einem Check für
newkey!=oldkey
können Sie auf folgende Weise Folgendes tun:quelle
dict
Reihenfolge verlassen, auch wenn python3.6 + es in geordneter Form initialisiert, frühere Versionen nicht und es ist nicht wirklich eine Funktion, die nur einen Einfluss darauf hat, wie sich py3.6 + -Diktate geändert haben. VerwendenOrderedDict
Sie diese Option, wenn Sie sich für die Bestellung interessieren.Bei Umbenennung aller Wörterbuchschlüssel:
quelle
target_dict.keys()
garantiert die gleiche Reihenfolge wie in der Definition? Ich dachte, ein Python-Diktat ist ungeordnet und die Reihenfolge aus der Schlüsselansicht einesSie können dieses
OrderedDict recipe
von Raymond Hettinger geschriebene verwenden und es ändern, um einerename
Methode hinzuzufügen , aber dies wird ein O (N) in der Komplexität sein:Beispiel:
Ausgabe:
quelle
OrderedDict
sie. Aber ich würde empfehlen: Erstellen Sie eine Klasse, die von erbt,OrderedDict
und fügen Sie einerename
Methode hinzu.Einige Leute vor mir erwähnten den
.pop
Trick, einen Schlüssel in einem Einzeiler zu löschen und zu erstellen.Ich persönlich finde die explizitere Implementierung lesbarer:
Der obige Code wird zurückgegeben
{'a': 1, 'c': 2}
quelle
Andere Antworten sind ziemlich gut. Aber in Python3.6 hat reguläres Diktat auch Ordnung. Daher ist es im Normalfall schwierig, die Position des Schlüssels beizubehalten.
quelle
In Python 3.6 (ab?) Würde ich mich für den folgenden Einzeiler entscheiden
was produziert
Es kann erwähnenswert sein, dass
print
die ipython console / jupyter notebook das Wörterbuch ohne die Anweisung in einer Reihenfolge ihrer Wahl präsentiert ...quelle
Ich habe mir diese Funktion ausgedacht, die das ursprüngliche Wörterbuch nicht mutiert. Diese Funktion unterstützt auch die Liste der Wörterbücher.
quelle
Ich verwende die obige Antwort von @wim mit dict.pop (), wenn ich Schlüssel umbenenne, aber ich habe ein Gotcha gefunden. Das Durchlaufen des Diktats zum Ändern der Schlüssel, ohne die Liste der alten Schlüssel vollständig von der Diktatinstanz zu trennen, führte dazu, dass neue, geänderte Schlüssel in die Schleife verschoben wurden und einige vorhandene Schlüssel fehlten.
Zunächst habe ich es so gemacht:
Ich stellte fest, dass das Wörterbuch beim Durchlaufen des Diktats auf diese Weise immer wieder Schlüssel fand, auch wenn es nicht sollte, dh die neuen Schlüssel, die ich geändert hatte! Ich musste die Instanzen vollständig voneinander trennen, um (a) zu vermeiden, dass meine eigenen geänderten Schlüssel in der for-Schleife gefunden wurden, und (b) einige Schlüssel zu finden, die aus irgendeinem Grund nicht in der Schleife gefunden wurden.
Ich mache das jetzt:
Das Konvertieren von my_dict.keys () in eine Liste war erforderlich, um den Verweis auf das sich ändernde Diktat zu entfernen. Allein die Verwendung von my_dict.keys () hat mich mit den seltsamen Nebenwirkungen an die ursprüngliche Instanz gebunden.
quelle
Falls jemand alle Schlüssel auf einmal umbenennen möchte und eine Liste mit den neuen Namen bereitstellt:
quelle
@ helloswift123 Ich mag deine Funktion. Hier ist eine Änderung zum Umbenennen mehrerer Schlüssel in einem einzigen Aufruf:
quelle
Angenommen, Sie möchten den Schlüssel k3 in k4 umbenennen:
quelle
TypeError: 'dict' object is not callable
Wenntemp_dict('k3')
Sie versuchen, auf den Wert desk3
Schlüssels zu verweisen , sollten Sie eckige Klammern und keine Klammern verwenden. Dadurch wird jedoch nur ein neuer Schlüssel zum Wörterbuch hinzugefügt und ein vorhandener Schlüssel nicht wie gewünscht umbenannt.