Je veux fusionner des dictionnaires imbriqués en Python

Je voulais fusionner des dictionnaires imbriqués, mais je ne trouve aucun article approprié.

Faites un dict pour le moment.

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"
		}
	}
}

Le résultat est que "depthx_a" est écrasé par la valeur de dict2, et "depthx_b" et "depthx_c" restent.

J'ai essayé plusieurs méthodes en référence à Diverses façons de fusionner plusieurs dictionnaires, mais "depthx_b" disparaît après la deuxième étape d'imbrication. ..

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"
}

La profondeur1_a / profondeur1_b / profondeur1_c dans la première étape de l'imbrication était comme prévu, mais sinon, elle a été écrasée avec la clé sans aller voir le contenu.

Il semble qu'il y ait ChainMap de Python 3.3, donc je vais l'essayer.

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"
}

Non.

Après tout, quand je me promenais je dois le faire moi-même, c'est ennuyeux, etc. [dictknife.deepmerge](https://pypi.org/ J'ai trouvé quelque chose comme project / dictknife / 0.4.0 /). Je n'ai pas d'autre choix que d'attendre du nom.

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"
}

C'est ce que je cherchais!

Cependant, malheureusement, le comportement lors de l'insertion de différents moules est subtil. Si je mets None dans la valeur littérale comme "" depth3_3_a ": None, il sera écrasé et deviendra None, mais si je voulais supprimer la branche imbriquée elle-même et définir" depth3_2 ": None, il était simplement ignoré. Dans ce cas, j'ai eu une erreur lorsque j'ai défini " depth3_2 ":" "`. Pardon.

Cependant, cette fusion profonde, les informations japonaises ne sortent pas tellement que je suis surpris du tout. C'est pratique, donc je pense que tout le monde devrait l'utiliser.

Recommended Posts

Je veux fusionner des dictionnaires imbriqués en Python
Je veux faire le test de Dunnett en Python
Je veux créer une fenêtre avec Python
Je veux afficher la progression en Python!
Je veux écrire en Python! (1) Vérification du format de code
Je veux facilement implémenter le délai d'expiration en python
Je veux écrire en Python! (2) Écrivons un test
Même avec JavaScript, je veux voir Python `range ()`!
Je veux échantillonner au hasard un fichier avec Python
Je veux travailler avec un robot en python.
[Python] Je veux faire d'une liste imbriquée un taple
Je veux écrire en Python! (3) Utiliser des simulacres
Je veux utiliser le jeu de données R avec python
Je veux faire quelque chose avec Python à la fin
Je veux manipuler des chaînes dans Kotlin comme Python!
Je veux déboguer avec Python
Je veux faire quelque chose comme sort uniq en Python
Je veux pouvoir exécuter Python avec VS Code
Je veux ajouter un joli complément à input () en python
J'ai essayé d'implémenter PLSA en Python
J'ai essayé d'implémenter la permutation en Python
Je veux imprimer dans la notation d'inclusion
Je veux utiliser jar de python
Je veux créer un environnement Python
Je veux analyser les journaux avec Python
Je veux jouer avec aws avec python
J'ai essayé d'implémenter ADALINE en Python
Je voulais résoudre ABC159 avec Python
J'ai essayé d'implémenter PPO en Python
Je veux intégrer Matplotlib dans PySimpleGUI
Je veux résoudre APG4b avec Python (seulement 4.01 et 4.04 au chapitre 4)
[Couches Python / AWS Lambda] Je souhaite réutiliser uniquement le module dans AWS Lambda Layers
Je veux utiliser MATLAB feval avec python
Je veux corriger Datetime.now dans le test de Django
Je veux mémoriser, y compris les arguments de mots clés de Python
Python: j'ai pu récurer en lambda
Je souhaite envoyer un e-mail depuis Gmail en utilisant Python.
[Python] Je veux gérer 7DaysToDie depuis Discord! 1/3
Je veux faire un jeu avec Python
J'ai écrit "Introduction à la vérification des effets" en Python
Je souhaite convertir une table convertie en PDF en Python en CSV
Je veux convertir par lots le résultat de "chaîne de caractères" .split () en Python
Je veux expliquer en détail la classe abstraite (ABCmeta) de Python
J'ai essayé d'implémenter TOPIC MODEL en Python
Je souhaite utiliser le répertoire temporaire avec Python2
Maintenance de l'environnement réalisée avec Docker (je souhaite post-traiter GrADS en Python
Je veux colorer une partie de la chaîne Excel avec Python
Je veux utiliser le solveur ceres de python
#Unresolved Je veux compiler gobject-introspection avec Python3
Je veux résoudre APG4b avec Python (chapitre 2)
Je souhaite vendre les produits que j'ai listés par python scraping Mercari
[Python] Je veux gérer 7DaysToDie depuis Discord! 2/3
Je veux créer du code C ++ à partir de code Python!
J'ai essayé d'implémenter le tri sélectif en python
Je veux écrire dans un fichier avec Python
Je veux faire un patch monkey seulement en partie en toute sécurité avec Python
J'ai essayé d'implémenter le tri par fusion en Python avec le moins de lignes possible
Je souhaite utiliser Python dans l'environnement de pyenv + pipenv sous Windows 10
Je souhaite créer une file d'attente prioritaire pouvant être mise à jour avec Python (2.7)