Python

¿Cómo puedo fusionar dos diccionarios en Python?

A la hora de trabajar con Python, uno de los tipos de datos más utilizados es el diccionario (dict). Algo que se debe a su capacidad para almacenar los datos en formato clave-valor de una forma eficiente, siendo la solución ideal para representar las configuraciones, realizar recuento de elementos y para estructuras complejas, entre muchas otras tareas. Por eso, la necesidad de fusionar diccionarios puede aparecer con bastante frecuencia.

Un escenario habitual en el que nos podemos encontrar al trabajar con diccionarios es cuando se cuenta con dos o más diccionarios separados y necesitamos combinarlos o fusionarlos en uno solo. Ya sea porque necesitamos unificar varias configuraciones, combinar resultados parciales o simplemente reorganizar los datos.

En esta entrada, explicaremos en profundidad las diferentes formas que existen para fusionar dos diccionarios en Python. Veremos las formas clásicas, las más modernas (introducidas a partir de Python 3.5 y 3.9), y cómo manejar colisiones de claves. También presentaremos ejemplos prácticos que muestren su uso en situaciones reales y terminaremos con una sección de conclusiones.

¿Qué significa fusionar diccionarios?

Antes de adentrarnos en el cómo, es importante definir claramente qué significa fusionar diccionarios. Fusionar diccionarios significa crear un nuevo diccionario que contenga todas las claves y valores de los diccionarios originales.

Por ejemplo, si tenemos los siguientes dos diccionarios:

a = {'x': 1, 'y': 2}
b = {'y': 3, 'z': 4}

Queremos obtener un nuevo diccionario que combine ambos:

{'x': 1, 'y': 3, 'z': 4}

En este ejemplo es importante notar que la clave 'y' existe en ambos diccionarios y su valor es diferente, por lo que solamente se puede conservar un. En este caso, el valor de 'y' en el segundo diccionario (b) sobrescribe al valor en el primero (a). Este comportamiento de sobreescritura es algo común cuando se fusionan diccionarios y es importante tenerlo en cuenta.

Métodos para fusionar diccionarios en Python

Actualmente existen diferentes formas de fusionar diccionarios en Python. Algunas, las más modernas, son más expresivas y otras se pueden utilizar cuando se necesita mantener la compatibilidad con versiones anteriores de Python. A continuación, revisaremos los principales métodos.

Usar el operador | (Desde Python 3.9)

A partir de Python 3.9, se introdujo una forma muy concisa y elegante para fusionar diccionarios: el operador | (pipe).

a = {'x': 1, 'y': 2}
b = {'y': 3, 'z': 4}

c = a | b

print(c) 
{'x': 1, 'y': 3, 'z': 4}

Este método ofrece las ventajas de ser muy conciso, altamente legible y no modifica los diccionarios originales. Además, funciona como una sola expresión. La única desventaja es que esta solamente está disponible a partir de Python 3.9 (Octubre de 2020).

Combinación con otros operadores

Este operador también se puede usar para fusionar múltiples diccionarios simplemente usando varios:

d = a | b | {'w': 5}

print(d)
{'x': 1, 'y': 3, 'z': 4, 'w': 5}

Además de permitir actualizar de forma expresiva y elegante uno de los diccionarios:

a |= b

print(a)
{'x': 1, 'y': 3, 'z': 4}

Usar el método dict.update()

El método clásico para combinar dos diccionarios es usando el método update() que existe en estos objetos:

a = {'x': 1, 'y': 2}
b = {'y': 3, 'z': 4}

c = a.copy()
c.update(b)

print(c)
{'x': 1, 'y': 3, 'z': 4}

La principal ventaja de este método es su compatibilidad con todas las versiones de Python, no es necesario comprobar que se trabaja con una actual. Además de ser un método intuitivo y claro.

Entre sus desventajas se encuentra que, para evitar modificar los objetos originales es necesario usar dos expresiones (copy y update), por lo que no es tan sencillo. Aunque el uso de copy no es necesario si se desea modificar uno de los diccionarios originales.

a.update(b)

print(a)
{'x': 1, 'y': 3, 'z': 4}

Usar ** (Desempaquetado de diccionarios)

Desde Python 3.5, puedes usar el desempaquetado de diccionarios (**) dentro de una expresión dict(...).

a = {'x': 1, 'y': 2}
b = {'y': 3, 'z': 4}

c = {**a, **b}

print(c) 
{'x': 1, 'y': 3, 'z': 4}

Esta opción es más expresiva y fácil de leer que el método update(). Además de funcionar como una sola expresión y no modifica los originales. Entre sus posibles desventajas se encuentra la necesidad de Python 3.5 (aunque es una versión que tiene una década, lanzada en septiembre de 2015) y solo permite crear un nuevo diccionario.

Al igual que el operador |, también puedes desempaquetar más de dos diccionarios:

d = {**a, **b, **{'w': 5}}

print(d)
{'x': 1, 'y': 3, 'z': 4, 'w': 5}

Usar comprensión de diccionarios

Otra opción es usar comprensión de diccionarios para fusionar explícitamente:

a = {'x': 1, 'y': 2}
b = {'y': 3, 'z': 4}

c = {k: v for d in (a, b) for k, v in d.items()}

print(c)
{'x': 1, 'y': 3, 'z': 4}

Un método que es compatible con todas las versiones modernas y se puede ajustar para cualquier necesidad específica y casos particulares. Pero presenta dos problemas importantes, es menos legible para principiantes y puede sobrescribir claves sin control.

¿Qué sucede con las claves duplicadas?

Una cuestión fundamental al fusionar diccionarios es qué hacer cuando hay claves duplicadas. En todos los métodos mencionados, los valores del segundo diccionario sobrescriben a los del primero.

Esto es consistente con la semántica de Python, y es la opción que tiene más sentido en la mayoría de los contextos. Sin embargo, si se desea preservar ambos valores, se requiere una lógica personalizada que se puede conseguir con collections.

Ejemplo: fusionar preservando todos los valores

A continuación, se muestra un método para crear un diccionario que combina los valores de los dos originales. Para ello cada una de las claves pasa de tener un valor a una lista en la que se almacenan los valores de ambos diccionarios.

from collections import defaultdict

a = {'x': 1, 'y': 2}
b = {'y': 3, 'z': 4}

merged = defaultdict(list)

for d in (a, b):
    for k, v in d.items():
        merged[k].append(v)

print(dict(merged))
{'x': [1], 'y': [2, 3], 'z': [4]}

Conclusiones

Fusionar diccionarios es una operación muy habitual y fundamental en Python. Gracias a las mejoras introducidas en versiones recientes del lenguaje, hoy contamos con herramientas potentes y elegantes que nos permiten hacerlo de forma simple y eficiente.

En esta entrada hemos visto las siguientes opciones para realizar esta operación:

  • A partir de Python 3.9, el operador | permite fusionar diccionarios de forma limpia y legible.
  • Desde Python 3.5, puedes usar {**a, **b} para combinar diccionarios.
  • Métodos como update() o la comprensión de diccionarios siguen siendo útiles, especialmente en contextos personalizados o para versiones antiguas.
  • Si necesitas más control sobre la fusión (como conservar ambos valores de claves duplicadas), puedes usar defaultdict o Counter.

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez

Recent Posts

¿Está concentrado el MSCI World? Un análisis con Gini, Lorenz y leyes de potencia

El MSCI World Index suele presentarse como “la ventana al mundo” para quienes invierten en…

12 horas ago

Curiosidad: La maldición de la dimensionalidad, o por qué añadir más datos puede empeorar tu modelo

En el mundo del análisis de datos solemos escuchar una idea poderosa: cuantos más datos,…

5 días ago

Error npm ERR! code EACCES al instalar paquetes en Node.js: Cómo solucionarlo paso a paso

¿Te has encontrado con este error al intentar instalar paquetes con npm? npm ERR! code…

1 semana ago

Curiosidad: La Paradoja de Simpson, o por qué no siempre debes fiarte de los promedios

En ciencia de datos y estadística, los promedios y porcentajes son herramientas fundamentales para resumir…

2 semanas ago

Copias de seguridad automáticas en SQL Server con rotación de archivos

Las bases de datos son el corazón de casi cualquier sistema de información moderno. Ya…

2 semanas ago

Curiosidad: La Ley de Twyman y la trampa de los datos “interesantes”

En ciencia de datos, pocas cosas llaman más la atención de los científicos de datos…

3 semanas ago

This website uses cookies.