Cómo fusionar dos diccionarios en Python

    Introducción

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

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

    Fusionar 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, y el traje verde del diccionario B ocupa el lugar del traje naranja:

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

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

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

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

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

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

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

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

    Usando elementos ()

    Comencemos por combinar con items():

    >>> 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, el items() la llamada debe enviarse a un list() y luego combinado:

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

    Usando la actualización del diccionario ()

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

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

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

    >>> 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 combinaciones de diccionarios y cómo podemos combinar dos diccionarios en diferentes versiones de Python. Combinar diccionarios puede ser bastante útil en situaciones como leer varios archivos JSON, crear un mapa de objetos o incluso crear índices de contenido.

     

    Etiquetas:

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *