
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.
Tabla de contenidos
¿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
oCounter
.
Deja una respuesta