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
Libérer: 2024-11-12 03:58:02
original
1065 Les gens l'ont consulté

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}
    }
}
Copier après la connexion

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)
Copier après la connexion
{
    "level1": {
        "level2": {"levelB": 10}
    }
}
Copier après la connexion

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
Copier après la connexion

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)
Copier après la connexion
{
    "level1": {
        "level2": {"levelA": 0, "levelB": 10}
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal