Cómo fusionar dos diccionarios en Python

C

Introducción

No es raro tener dos diccionarios en Python que le gustaría combinar. En este artículo, veremos varias formas de fusionar dos diccionarios en Python.

Algunas soluciones no están disponibles para todas las versiones de Python, por lo que también examinaremos formas de fusionar las versiones seleccionadas.

Al fusionar diccionarios, debemos considerar lo que sucederá cuando los dos diccionarios tengan las mismas claves. Primero definamos lo que debería suceder cuando nos fusionamos.

Fusionar diccionarios en Python

Las fusiones suelen ocurrir de derecha a izquierda, como dict_a <- dict_b. Cuando hay un titular de clave común en ambos diccionarios, el valor del segundo diccionario sobrescribe el valor del primer diccionario.

Esto se puede demostrar en la ilustración que se muestra a continuación, donde los componentes del diccionario B se fusionan con A, y el traje verde del diccionario B ocupa el lugar del traje naranja:

A lo largo de este artículo, utilizaremos los siguientes diccionarios.

  • Diccionarios con valores:
>>> a = {1:'peanut', 2:'butter', 3:'jelly', 4:'time'}
>>> b = {1:'fish', 2:'chips'}
  • Diccionarios con valores anidados:
>>> c = {1: ['peanut','butter','jelly','time'], 2:['fish','chips']}
>>> d = {1: ['fish','chips'], 2:['peanut','butter','jelly','time']}

Python 3.9 y superior

Desde la versión 3.9 de Python en adelante, podemos usar los operadores de combinación (representados por | ) para combinar dos diccionarios:

>>> x = a | b
>>> print(x)
{1: 'fish', 2: 'chips', 3: 'jelly', 4: 'time'}

Los operadores de combinación de diccionario también se pueden utilizar en lugar de diccionarios anidados. Aquí tiene lugar la sobrescritura completa del valor de la clave coincidente:

>>> y = c | d
>>> print(y)
{1: ['fish', 'chips'], 2: ['peanut', 'butter', 'jelly', 'time']}

Python 3 y superior

Para versiones anteriores de Python 3, lamentablemente no podemos usar los operadores de combinación. En su lugar, podemos fusionar desempaquetando ambos diccionarios, usando el ** asteriscos dobles, dentro de otro diccionario como se muestra a continuación:

>>> x = {**a, **b}
>>> print(x)
{1: 'fish', 2: 'chips', 3: 'jelly', 4: 'time'}

Lo mismo se aplica a los diccionarios con valores de lista anidados. Los valores de las claves superpuestas se sobrescribirán de la siguiente manera:

>>> y = {**c, **d}
>>> print(y)
{1: ['fish', 'chips'], 2: ['peanut', 'butter', 'jelly', 'time']}

Python 2 y superior

En las versiones heredadas de Python, los fragmentos anteriores no funcionarán. En cambio, la combinación se puede facilitar combinando los elementos del diccionario, o dict_items de ambas variables.

También podemos utilizar el copy() y update() métodos de diccionario. Por último, podemos recorrer los elementos de un diccionario y usar el extend() método para agregarlo a otro diccionario.

Usando elementos ()

Comencemos por combinar con items():

>>> x = dict(a.items() + b.items())
>>> print(x)
{1: 'fish', 2: 'chips', 3: 'jelly', 4: 'time'}

La sintaxis anterior es válida para valores simples. Para un diccionario anidado que contiene valores de lista, el items() la llamada debe enviarse a un list() y luego combinado:

>>> y = dict(list(c.items()) + list(d.items()))
>>> print(y)
{1: ['fish', 'chips'], 2: ['peanut', 'butter', 'jelly', 'time']}

Esta solución funciona bien porque las claves eran numéricas, se conservaron las claves originales. Para claves de diferentes tipos, preferiría la siguiente opción.

Usando la actualización del diccionario ()

Otra forma de realizar la combinación es copiar uno de los diccionarios y actualizarlo con el otro como se muestra a continuación:

>>> x = a.copy()
>>> x.update(b)
>>> print (x)
{1: 'fish', 2: 'chips', 3: 'jelly', 4: 'time'}

Agregar valores de lista en todas las versiones de Python

En las secciones anteriores, hemos sobrescrito los valores anidados de los diccionarios combinados. Hay casos en los que los valores anidados deben agregarse en lugar de sobrescribirse.

Esto se puede hacer usando el extend() método como se muestra a continuación:

>>> for k, v in d.items():
...    if k in c:
...        c[k].extend(v)
...    else:
...       c[k] = v
>>>
>>> print(c)
{1: ['peanut', 'butter', 'jelly', 'time', 'fish', 'chips'], 2: ['fish', 'chips', 'peanut', 'butter', 'jelly']}

Conclusión

En este artículo, hemos aprendido cómo funcionan las combinaciones de diccionarios y cómo podemos combinar dos diccionarios en diferentes versiones de Python. Combinar diccionarios puede ser bastante útil en situaciones como leer varios archivos JSON, crear un mapa de objetos o incluso crear índices de contenido.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

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