0%
Python Tricks: Guía completa para fusionar diccionarios (Dictionary Merge)

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.

I

InSkillCoach

· min

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

  1. 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.

  2. Legibilidad: El operador | (Python 3.9+) ofrece la sintaxis más clara y concisa.

  3. Inmutabilidad: Si no quieres modificar los diccionarios originales, utiliza el operador | o el desempaquetado con **.

  4. 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

InSkillCoach

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+
1.9k
298

Comentarios

Los comentarios funcionan con GitHub Discussions

Inicia sesión con GitHub para participar en la discusión

¡Enlace copiado!