Cómo fusionar dos diccionarios en Python

En este artículo, veremos varias formas de fusionar dos diccionarios en Python versión 3.9, versiones anteriores de 3 y Python 2.

Introducción

No es raro tener dos diccionarios en Python que le gustaría combinar. En este artículo, veremos varias formas de cómo 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 para versiones seleccionadas.

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

Combinación de 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, con el palo verde del diccionario B tomando el lugar del palo naranja:

Una fusión de diccionario donde los valores con la misma clave en el segundo conjunto sobrescriben los valores del primer conjunto

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

  • Diccionarios con valores:
1
2
>>> a = {1:'peanut', 2:'butter', 3:'jelly', 4:'time'}
>>> b = {1:'fish', 2:'chips'}
  • Diccionarios con valores anidados:
1
2
>>> 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:

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

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

1
2
3
>>> 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 combinarlos desempaquetando ambos diccionarios, usando los asteriscos dobles **, dentro de otro diccionario como se muestra a continuación:

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

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

1
2
3
>>> 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 usar los métodos de diccionario copy() y update(). Por último, podemos recorrer los elementos de un diccionario y usar el método extender() para agregarlo a otro diccionario.

Uso de elementos() {#uso de elementos}

Empecemos por combinar con items():

1
2
3
>>> 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, la llamada items() debe convertirse en list() y luego combinarse:

1
2
3
>>> 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 llaves de diferentes tipos, preferiría la siguiente opción.

Uso del diccionario update()

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

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

Adición de 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 método extender() como se muestra a continuación:

1
2
3
4
5
6
7
8
>>> 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 fusiones de diccionarios y cómo podemos fusionar dos diccionarios en diferentes versiones de Python. La combinación de diccionarios puede ser muy útil en situaciones como la lectura de varios archivos JSON, la creación de un mapa de objetos o incluso la creación de índices de contenido.