Ich möchte verschachtelte Dicts in Python zusammenführen

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

Ich möchte verschachtelte Dicts in Python zusammenführen
Ich möchte Dunnetts Test in Python machen
Ich möchte mit Python ein Fenster erstellen
Ich möchte den Fortschritt in Python anzeigen!
Ich möchte in Python schreiben! (1) Überprüfung des Codeformats
Ich möchte Timeout einfach in Python implementieren
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
Auch mit JavaScript möchte ich Python `range ()` sehen!
Ich möchte eine Datei mit Python zufällig testen
Ich möchte mit einem Roboter in Python arbeiten.
[Python] Ich möchte aus einer verschachtelten Liste einen Taple machen
Ich möchte in Python schreiben! (3) Verwenden Sie Mock
Ich möchte R-Datensatz mit Python verwenden
Ich möchte am Ende etwas mit Python machen
Ich möchte Strings in Kotlin wie Python manipulieren!
Ich möchte mit Python debuggen
Ich möchte so etwas wie Uniq in Python sortieren
Ich möchte Python mit VS-Code ausführen können
Ich möchte eine schöne Ergänzung zu input () in Python hinzufügen
Ich habe versucht, PLSA in Python zu implementieren
Ich habe versucht, Permutation in Python zu implementieren
Ich möchte in der Einschlussnotation drucken
Ich möchte ein Glas aus Python verwenden
Ich möchte eine Python-Umgebung erstellen
Ich möchte Protokolle mit Python analysieren
Ich möchte mit aws mit Python spielen
Ich habe versucht, ADALINE in Python zu implementieren
Ich wollte ABC159 mit Python lösen
Ich habe versucht, PPO in Python zu implementieren
Ich möchte Matplotlib in PySimpleGUI einbetten
Ich möchte APG4b mit Python lösen (nur 4.01 und 4.04 in Kapitel 4)
[Python / AWS Lambda-Ebenen] Ich möchte nur Module in AWS Lambda-Ebenen wiederverwenden
Ich möchte MATLAB feval mit Python verwenden
Ich möchte Datetime.now in Djangos Test reparieren
Ich möchte mich mit Schlüsselwortargumenten von Python merken
Python: Ich konnte in Lambda rekursieren
Ich möchte mit Python eine E-Mail von Google Mail senden.
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 1/3
Ich möchte ein Spiel mit Python machen
Geschrieben "Einführung in die Effektüberprüfung" in Python
Ich möchte eine in Python in PDF konvertierte Tabelle wieder in CSV konvertieren
Ich möchte das Ergebnis von "Zeichenfolge" .split () in Python stapelweise konvertieren
Ich möchte die abstrakte Klasse (ABCmeta) von Python im Detail erklären
Ich habe versucht, TOPIC MODEL in Python zu implementieren
Ich möchte Temporäres Verzeichnis mit Python2 verwenden
Mit Docker durchgeführte Umgebungswartung (Ich möchte GrADS in Python nachbearbeiten
Ich möchte einen Teil der Excel-Zeichenfolge mit Python einfärben
Ich möchte Ceres Solver aus Python verwenden
#Unresolved Ich möchte Gobject-Introspection mit Python3 kompilieren
Ich möchte APG4b mit Python lösen (Kapitel 2)
Ich möchte die Produkte verkaufen, die ich durch Python Scraping Mercari aufgelistet habe
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 2/3
Ich möchte C ++ - Code aus Python-Code erstellen!
Ich habe versucht, eine selektive Sortierung in Python zu implementieren
Ich möchte mit Python in eine Datei schreiben
Ich möchte Affenpatches nur teilweise sicher mit Python machen
Ich habe versucht, die Zusammenführungssortierung in Python mit möglichst wenigen Zeilen zu implementieren
Ich möchte Python in der Umgebung von pyenv + pipenv unter Windows 10 verwenden
Ich möchte eine Prioritätswarteschlange erstellen, die mit Python (2.7) aktualisiert werden kann.