Mise à jour du dictionnaire imbriqué avec préservation de la profondeur
En Python, la mise à jour d'un dictionnaire imbriqué peut être délicate, surtout lorsque vous souhaitez fusionner son contenu avec un autre dictionnaire tout en préservant des valeurs spécifiques à différentes profondeurs. Considérons le scénario suivant :
Étant donné deux dictionnaires, dictionnaire1 et mise à jour, comment pouvons-nous mettre à jour le dictionnaire1 avec le contenu de la mise à jour sans écraser une valeur particulière au niveau le plus profond (par exemple, "niveauA") tout en mettant à jour toutes les autres valeurs ?
dictionary1 = { "level1": { "level2": {"levelA": 0, "levelB": 1} } } update = { "level1": { "level2": {"levelB": 10} } }
Si nous utilisons simplement la méthode de mise à jour, elle écrase tout le sous-dictionnaire "level2", perdant le "levelA" value :
dictionary1.update(update) print(dictionary1)
{ "level1": { "level2": {"levelB": 10} } }
Pour relever ce défi, nous avons besoin d'une solution récursive qui prend en compte la profondeur variable des dictionnaires et fusionne les valeurs de manière appropriée.
Solution récursive :
Le code suivant implémente une fonction récursive de « mise à jour partielle » qui met à jour les valeurs du dictionnaire sans écraser les valeurs spécifiées. clés :
import copy def partial_update(d, u, preserve): for k, v in u.items(): if isinstance(v, dict): if d.get(k, None) is None: d[k] = copy.deepcopy(v) else: partial_update(d[k], v, preserve) elif k in preserve: continue else: d[k] = copy.deepcopy(v) return d
La fonction partial_update prend trois arguments :
Pour préserver la valeur "levelA" dans notre exemple, on peut utiliser le code suivant :
partial_update(dictionary1, update, ["levelA"]) print(dictionary1)
{ "level1": { "level2": {"levelA": 0, "levelB": 10} } }
Dans cette solution, on fait une copie des dictionnaires avant la mise à jour pour éviter des modifications inattendues. Cela garantit que les dictionnaires originaux restent intacts même après la mise à jour partielle.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!