Unión de objetos dict en Python [duplicado]


Esta pregunta ya tiene una respuesta aquí:

¿Cómo se calcula la unión de dos objetos dict en Python, donde un par (key, value) 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} is {'a' : 0, 'b' : 1, 'c' : 2}.

Preferiblemente puede hacer esto sin modificar ninguna entrada dict. Ejemplo de donde esto es útil: Obtener un dict de todas las variables actualmente en el ámbito y sus valores

Author: Community, 2012-03-22

4 answers

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

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]'}
 75
Author: Mechanical snail,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:55:00

También puede utilizar update método de dict como

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

a.update(b)
print a
 67
Author: Nilesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-22 09:54:27

Dos diccionarios

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

n diccionarios

def union(*dicts):
    return dict(itertools.chain.from_iterable(dct.items() for dct in dicts))
 21
Author: Mathieu Larose,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-02 18:19:57

Si necesita que ambos dictos permanezcan independientes y actualizables, puede crear un único objeto que consulte ambos diccionarios en su método __getitem__ (e implementar get, __contains__ y otro método de asignación según 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
>>> 
 7
Author: jsbueno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-22 11:24:26