dictionnaire de fusion python
阿神
阿神 2017-06-22 11:52:21
0
2
1002

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 ?

阿神
阿神

闭关修行中......

répondre à tous(2)
洪涛

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

代言

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal