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
Mary-Kate Olsenoriginal
2024-12-04 20:42:11351parcourir

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

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'}}}

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, ...], {})

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