Pregunta Unión de objetos dict en Python [duplicado]


Esta pregunta ya tiene una respuesta aquí:

¿Cómo se calcula la unión de dos dict objetos en Python, donde (key, value) par está presente en el resultado iff key es in ya sea dict (a menos que haya duplicados)?

Por ejemplo, la unión de {'a' : 0, 'b' : 1} y {'c' : 2} es {'a' : 0, 'b' : 1, 'c' : 2}.

Preferiblemente puede hacer esto sin modificar ninguna de las entradas dict. Ejemplo de dónde esto es útil: Obtenga un dict de todas las variables actualmente en alcance y sus valores


75
2018-03-22 09:36


origen


Respuestas:


Esta pregunta proporciona un modismo Utiliza uno de los dictados como argumentos de palabra clave para el dict() constructor:

dict(y, **x)

Los duplicados se resuelven a favor del valor en x; por ejemplo

dict({'a' : 'y[a]'}, **{'a', 'x[a]'}) == {'a' : 'x[a]'}

70
2018-03-22 09:37



También puedes usar update método de dict como

a = {'a' : 0, 'b' : 1}
b = {'c' : 2}

a.update(b)
print a

63
2018-03-22 09:54



Dos diccionarios

def union2(dict1, dict2):
    return dict(list(dict1.items()) + list(dict2.items()))

norte diccionarios

def union(*dicts):
    return dict(itertools.chain.from_iterable(dct.items() for dct in dicts))

18
2017-10-17 01:56



Si necesita ambos dicts para mantenerse independiente y actualizable, puede crear un único objeto que consulte ambos diccionarios en su __getitem__ método (y poner en práctica get, __contains__ y otro método de mapeo cuando los necesite).

Un ejemplo minimalista podría ser así:

class UDict(object):
   def __init__(self, d1, d2):
       self.d1, self.d2 = d1, d2
   def __getitem__(self, item):
       if item in self.d1:
           return self.d1[item]
       return self.d2[item]

Y funciona:

>>> a = UDict({1:1}, {2:2})
>>> a[2]
2
>>> a[1]
1
>>> a[3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 7, in __getitem__
KeyError: 3
>>> 

5
2018-03-22 11:24