Maison  >  Questions et réponses  >  le corps du texte

dictionnaire de fusion python

Maintenant, il y a deux dicts. Ce dict a deux niveaux (il serait préférable que le nombre de niveaux puisse être personnalisé ou illimité), et je souhaite les fusionner

case1 :
Entrée : a : {1 : {"171 ": Vrai}} b : {1 : {"172 ": Faux}}
Sortie : {1 : {"171 ": Vrai, "172 ": Faux }}

case2 :
Entrée : a : {1 : {"171": True}} b : {1 : {"171": False}}
Sortie : {1 : {"171": False}}

La méthode dict.update que j'utilise en python ne peut être utilisée que dans une seule couche. Existe-t-il une bonne méthode d'implémentation ?

阿神阿神2675 Il y a quelques jours905

répondre à tous(2)je répondrai

  • PHP中文网

    PHP中文网2017-06-22 11:54:21

    Je viens d'écrire une fusion qui gère les dictionnaires multicouches

    from itertools import chain
    from functools import reduce
    
    
    def deep_merge_func(acc, item):
        if not acc:
            acc = {}
        k, v = item
        if isinstance(v, dict):
            original_v = acc.get(k)
            if original_v and isinstance(original_v, dict):
                return {**acc, k: deep_merge(original_v, v)}
        return {**acc, k: v}
    
    
    
    def deep_merge(origin, target):
        return reduce(deep_merge_func, chain(origin.items(), target.items()), None)
    
    
    a = {1: {"171": True}}
    b = {1: {"171": False}}
    
    print(deep_merge(a, b))
    
    
    c = {1: {"171": True}}
    d = {1: {"172": False}}
    print(deep_merge(c ,d))

    Seulement testé python3.6.1, il vous suffit d'appeler deep_merge

    L'écriture est plus fonctionnelle, ne m'en voulez pas

    répondre
    0
  • 代言

    代言2017-06-22 11:54:21

    Pour le cas 2 c'est relativement simple :

    >>> a={1:{"171": True}}
    >>> b={1:{"171":False}}
    >>> a.update(b)
    >>> a
    {1: {'171': False}}

    Pour le cas 1, vous pouvez faire ceci :

    >>> c={}
    >>> for k,v in a.items():
    ...     if k in b:
    ...         v.update(b[k])
    ...         c[k] = v
    ... 
    >>> c
    {1: {'172': False, '171': True}}

    Vous pouvez encapsuler les opérations ci-dessus dans des fonctions.

    répondre
    0
  • Annulerrépondre