Maison >développement back-end >Tutoriel Python >Comment mettre à jour un dictionnaire imbriqué en Python tout en préservant des valeurs spécifiques à différentes profondeurs ?

Comment mettre à jour un dictionnaire imbriqué en Python tout en préservant des valeurs spécifiques à différentes profondeurs ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-12 03:58:021067parcourir

How to Update a Nested Dictionary in Python While Preserving Specific Values at Different Depths?

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 :

  • d : Le dictionnaire à mettre à jour
  • u : Le dictionnaire contenant les mises à jour
  • préserver : une liste de clés à préserver de l'écrasement

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn