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