Unión de objetos dict en Python [duplicate]

5 minutos de lectura

avatar de usuario
caracol mecanico

¿Cómo se calcula la unión de dos? dict objetos en Python, donde un (key, value) el par está presente en el resultado iff key es in cualquiera de los dictados (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 entrada. dict. Ejemplo de dónde esto es útil: obtenga un dictado de todas las variables actualmente en el alcance y sus valores

  • @RikPoggi: La otra pregunta, a pesar de su título, es sobre cuál es el **d2 sintaxis es. Sucede que proporciona una respuesta a esta pregunta.

    – Caracol mecánico

    23 de marzo de 2012 a las 4:52

  • merged_dict = {**dict1, **dict2} en python 3.5+ (para ahorrarle un viaje al otro enlace o usar la solución con errores aceptada aquí que falla si sus claves no son cadenas).

    – Nathan

    11 de mayo de 2019 a las 1:14

  • merged_dict = dict(**a,**b,**c,**d) funcionó para mí también

    –Charlie Parker

    23 de julio de 2019 a las 21:10

  • Parece que la solución correcta vendrá en Python 3.9, consulte python.org/dev/peps/pep-0584

    – Atila123

    23 de abril de 2020 a las 13:12

  • Pitón 3.9: a = {1: 'a', 2: 'b', 3: 'c'}; b = {4: 'd', 5: 'e'}; c = a | b

    – Pygirl

    17 de junio de 2020 a las 6:35

avatar de usuario
caracol mecanico

Esta pregunta proporciona un modismo. Utiliza uno de los dictados como argumentos de palabras 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]'}

  • “Lo simple es mejor que lo complejo”. 🙂 Deberías usar update función miembro de dict.

    – shahjapan

    6 de agosto de 2012 a las 18:51


  • Como es tmp = dict(y); tmp.update(x); do_something(tmp) más simple?

    – Caracol mecánico

    7 de agosto de 2012 a las 6:04

  • @shahjapan Esto no es complejo, es un gran uso de la estructura de dictado de Python. Y esto es diferente de la actualización (esta solución no actualiza nada).

    – lajarre

    13 de septiembre de 2012 a las 9:09

  • No es ‘agradable’, es críptico e inmediatamente hace que la mayoría de los lectores se nieguen y el resto asume que todas las claves en x tendrían que ser nombres de parámetros legales. En mi humilde opinión, el hecho de que funcione es un error en los mecanismos de verificación de nombres en la implementación. ¿Qué sucede cuando confías en los errores? O se arreglan o se convierten en balones de fútbol políticos en el proceso del PEP.

    – Jon Jay Obermark

    1 de septiembre de 2014 a las 14:54


  • @JonJayObermark: De acuerdo. dict(x=2) esta bien pero dict(4=2) no es. Así que si x={4:2} el método propuesto fallará.

    – miguel

    09/04/2015 a las 15:42


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

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

a.update(b)
print a

  • Tenga en cuenta que .update cambios a. A veces, es inaceptable

    – Boris Gorelik

    18 de marzo de 2020 a las 15:04

  • hacer {**d1, **d2}. Para obtener más información, consulte: stackoverflow.com/questions/38987/…

    –Charlie Parker

    13 de julio de 2020 a las 21:17

avatar de usuario
jsbueno

Para un diccionario estático, combina instantáneas de otros dictados:

A partir de Python 3.9, el operador binario “o” | se ha definido para concatenar diccionarios. (Se crea con entusiasmo un diccionario nuevo y concreto):

>>> a = {"a":1}
>>> b = {"b":2}
>>> a|b
{'a': 1, 'b': 2}

Por el contrario, el |= Se ha implementado una asignación aumentada para que signifique lo mismo que llamar al update método:

>>> a = {"a":1}
>>> a |= {"b": 2}
>>> a
{'a': 1, 'b': 2}

Para más detalles, consulte PEP-584

Antes de Python 3.9, la forma más sencilla de crear un nuevo diccionario es crear un nuevo diccionario usando la “expansión de estrella” para agregar el contenido de cada subccionario en su lugar:

c = {**a, **b}

Para la combinación de diccionario dinámico, que funciona como “vista” para dictados en vivo combinados:

Si necesita que ambos dictados permanezcan independientes y actualizables, puede crear un solo objeto que consulte ambos diccionarios en su __getitem__ método (e implementar get, __contains__ y otro método de mapeo 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
>>> 

nótese bien: Si uno quiere mantener perezosamente una “vista” de Unión de dos o más diccionarios, marque collections.ChainMap en la biblioteca estándar, ya que tiene todos los métodos de diccionario y cubre casos de esquina no contemplados en el ejemplo anterior.

  • hacer {**d1, **d2}. Para obtener más información, consulte: stackoverflow.com/questions/38987/…

    –Charlie Parker

    13 de julio de 2020 a las 21:18

  • lo siento @neuron: tu edición rompió la respuesta. La segunda parte no es solamente para versiones anteriores, describe cómo crear una asignación personalizada que puede hacer referencia a subdiccionarios independientes, y esto no tiene nada que ver con la versión del idioma. (Debería volver en unos minutos y arreglarlo, pero por favor, tenga cuidado con el significado del texto/código al editar)

    – jsbueno

    21 de septiembre de 2021 a las 13:37

avatar de usuario
Mathieu Larose

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))

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad