Maison > développement back-end > Tutoriel Python > Comment puis-je fusionner de manière récursive des dictionnaires multi-niveaux en Python ?

Comment puis-je fusionner de manière récursive des dictionnaires multi-niveaux en Python ?

Mary-Kate Olsen
Libérer: 2024-12-04 20:42:11
original
348 Les gens l'ont consulté

How Can I Recursively Merge Multi-Level Dictionaries in Python?

Fusionner en profondeur des dictionnaires multi-niveaux

En Python, fusionner des dictionnaires de manière récursive tout en conservant une profondeur d'imbrication inconnue peut être un défi. Voici une solution qui résout ce problème :

def deep_merge(a: dict, b: dict, path=[]):
    for key in b:
        if key in a:
            if isinstance(a[key], dict) and isinstance(b[key], dict):
                deep_merge(a[key], b[key], path + [str(key)])
            elif a[key] != b[key]:
                raise Exception('Conflict at ' + '.'.join(path + [str(key)]))
        else:
            a[key] = b[key]
    return a
Copier après la connexion

Cette fonction prend deux dictionnaires en entrée et fusionne récursivement leur contenu. Il maintient un chemin pour suivre le niveau d'imbrication actuel afin de fournir des messages d'erreur plus précis en cas de conflits.

Exemple :

dict1 = {1:{'a':{'A'}}, 2:{'b':{'B'}}}
dict2 = {2:{'c':{'C'}}, 3:{'d':{'D'}}}
result = deep_merge(dict1, dict2)

print(result)
# {1:{'a':{'A'}}, 2:{'b':{'B'}, 'c':{'C'}}, 3:{'d':{'D'}}}
Copier après la connexion

Notez que deep_merge mute le premier argument, c'est pourquoi result contient le dictionnaire fusionné.

Pour fusionner plusieurs dictionnaires sans en modifier aucun, transmettez-les comme mot-clé arguments :

from functools import reduce
result = reduce(deep_merge, [dict1, dict2, ...], {})
Copier après la connexion

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