Python Tricks: Guía completa para fusionar diccionarios (Dictionary Merge)
Descubre todas las técnicas para fusionar diccionarios en Python, desde los métodos clásicos hasta el operador | de Python 3.9. Aprende a gestionar los conflictos de claves y a fusionar diccionarios anidados.
InSkillCoach
Python Tricks: Guía completa para fusionar diccionarios (Dictionary Merge)
Los diccionarios son una de las estructuras de datos más potentes de Python. La fusión de diccionarios es una operación habitual y existen varias formas de llevarla a cabo. En esta guía vamos a explorar todas las técnicas disponibles, de las más básicas a las más avanzadas.
1. Métodos clásicos de fusión
El método update()
El método más tradicional para fusionar diccionarios es update():
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}
dict1.update(dict2)
print(dict1) # {'a': 1, 'b': 2, 'c': 3, 'd': 4}
Unpacking con **
Un enfoque más moderno utiliza el operador de desempaquetado **:
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}
merged = {**dict1, **dict2}
print(merged) # {'a': 1, 'b': 2, 'c': 3, 'd': 4}
2. El nuevo operador | (Python 3.9+)
Python 3.9 introdujo un nuevo operador para fusionar diccionarios:
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}
merged = dict1 | dict2
print(merged) # {'a': 1, 'b': 2, 'c': 3, 'd': 4}
# Versión con asignación
dict1 |= dict2 # Equivalente a dict1.update(dict2)
3. Gestión de los conflictos de claves
¿Qué hacer cuando los diccionarios comparten claves?
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
# El último valor prevalece
merged = dict1 | dict2
print(merged) # {'a': 1, 'b': 3, 'c': 4}
# Solución personalizada
def merge_with_max(d1, d2):
return {k: max(d1.get(k, 0), d2.get(k, 0)) for k in set(d1) | set(d2)}
merged_max = merge_with_max(dict1, dict2)
print(merged_max) # {'a': 1, 'b': 3, 'c': 4}
4. Fusión de diccionarios anidados
La fusión de diccionarios anidados requiere un enfoque más sofisticado:
def deep_merge(dict1, dict2):
merged = dict1.copy()
for key, value in dict2.items():
if key in merged and isinstance(merged[key], dict) and isinstance(value, dict):
merged[key] = deep_merge(merged[key], value)
else:
merged[key] = value
return merged
dict1 = {'a': 1, 'b': {'x': 10, 'y': 20}}
dict2 = {'c': 3, 'b': {'y': 30, 'z': 40}}
merged = deep_merge(dict1, dict2)
print(merged) # {'a': 1, 'b': {'x': 10, 'y': 30, 'z': 40}, 'c': 3}
5. Buenas prácticas y consejos
-
Rendimiento: Para diccionarios pequeños, todos los métodos son equivalentes en términos de rendimiento. Para diccionarios grandes,
update()suele ser más rápido. -
Legibilidad: El operador
|(Python 3.9+) ofrece la sintaxis más clara y concisa. -
Inmutabilidad: Si no quieres modificar los diccionarios originales, utiliza el operador
|o el desempaquetado con**. -
Tipos: Asegúrate de que los valores sean compatibles al fusionar, sobre todo con diccionarios anidados.
6. Casos de uso avanzados
Fusión de varios diccionarios
dicts = [{'a': 1}, {'b': 2}, {'c': 3}]
# Método con |
merged = {}
for d in dicts:
merged |= d
# Alternativa con reduce
from functools import reduce
merged = reduce(lambda x, y: x | y, dicts)
Fusión condicional
def conditional_merge(dict1, dict2, condition):
return {
k: v for k, v in (dict1 | dict2).items()
if condition(k, v)
}
# Ejemplo: conservar solo los valores positivos
merged = conditional_merge(
{'a': 1, 'b': -2},
{'c': 3, 'd': -4},
lambda k, v: v > 0
)
print(merged) # {'a': 1, 'c': 3}
Recursos adicionales
Acerca de InSkillCoach
Experto en formación y tecnologías
Coach especializado en tecnologías avanzadas e IA, impulsado por GNeurone Inc.
Certificaciones:
- AWS Certified Solutions Architect – Professional
- Certificaciones de Google Cloud
- Microsoft Certified: DevOps Engineer Expert
- Certified Kubernetes Administrator (CKA)
- CompTIA Security+
Comentarios
Los comentarios funcionan con GitHub Discussions
Inicia sesión con GitHub para participar en la discusión