Ich wollte verschachtelte Diktate zusammenführen, kann aber keine geeigneten Artikel finden.
Machen Sie vorerst ein Diktat.
dict1 = {
"depth1_a": "x1a",
"depth1_b": "x1b",
"depth2_1": {
"depth2_a" : "x2a",
"depth2_b" : "x2b"
},
"depth3_1": {
"depth3_2": {
"depth3_3_a" : "x33a",
"depth3_3_b" : "x33b"
}
}
}
dict2 = {
"depth1_a": "y1a",
"depth1_c": "y1c",
"depth2_1": {
"depth2_a" : "y2a",
"depth2_c" : "y2c"
},
"depth3_1": {
"depth3_2": {
"depth3_3_a" : "y33a",
"depth3_3_c" : "y33c"
}
}
}
Das Ergebnis ist, dass "Tiefex_a" mit dem Wert von dict2 überschrieben wird und sowohl "Tiefex_b" als auch "Tiefex_c" erhalten bleiben.
Ich habe verschiedene Methoden in Bezug auf [Verschiedene Möglichkeiten zum Zusammenführen mehrerer Wörterbücher] ausprobiert (https://qiita.com/kk6/items/6362a5fc9f3f06a5969a), aber "depthx_b" verschwindet nach der zweiten Phase der Verschachtelung. ..
dict1.update(dict2)
print(dict1)
{
"depth1_a": "y1a",
"depth1_b": "x1b",
"depth2_1": {
"depth2_a": "y2a",
"depth2_c": "y2c"
},
"depth3_1": {
"depth3_2": {
"depth3_3_a": "y33a",
"depth3_3_c": "y33c"
}
},
"depth1_c": "y1c"
}
Die Tiefe1_a / Tiefe1_b / Tiefe1_c in der ersten Stufe des Nestes war wie erwartet, aber ansonsten wurde sie mit dem Schlüssel überschrieben, ohne den Inhalt zu sehen.
Es scheint, dass es ChainMap von Python 3.3 gibt, also werde ich es versuchen.
from collections import ChainMap
dict_map = ChainMap(dict1, dict2)
dict(dict_map)
{
"depth1_a": "y1a",
"depth1_c": "y1c",
"depth2_1": {
"depth2_a": "y2a",
"depth2_c": "y2c"
},
"depth3_1": {
"depth3_2": {
"depth3_3_a": "y33a",
"depth3_3_c": "y33c"
}
},
"depth1_b": "x1b"
}
Nein.
Immerhin ist es ärgerlich, wenn ich herumwanderte ich muss es selbst tun usw. [dictknife.deepmerge](https://pypi.org/ Ich habe so etwas wie project / dictknife / 0.4.0 /) gefunden. Ich habe keine andere Wahl, als vom Namen zu erwarten.
from dictknife import deepmerge
deepmerge(dict1, dict2)
{
"depth1_a": "y1a",
"depth1_b": "x1b",
"depth2_1": {
"depth2_a": "y2a",
"depth2_b": "x2b",
"depth2_c": "y2c"
},
"depth3_1": {
"depth3_2": {
"depth3_3_a": "y33a",
"depth3_3_b": "x33b",
"depth3_3_c": "y33c"
}
},
"depth1_c": "y1c"
}
Das habe ich gesucht!
Leider ist das Verhalten beim Einsetzen verschiedener Formen subtil. Wenn ich None in den Literalwert wie "depth3_3_a": None "eingefügt habe, wird dieser überschrieben und zu None. Wenn ich jedoch den verschachtelten Zweig selbst löschen und" depth3_2 ": None" setzen wollte, wurde er einfach ignoriert. In diesem Fall habe ich einen Fehler erhalten, als ich "depth3_2" eingestellt habe: Es tut uns leid.
Diese tief verschmolzene japanische Information kommt jedoch nicht so oft heraus, dass ich überhaupt überrascht bin. Es ist praktisch, also denke ich, dass jeder es benutzen sollte.
Recommended Posts