Cómo combinar dos diccionarios de Python

En un tutorial anterior hablamos sobre los diccionarios de Python, y vimos que son listas no ordenadas con un par clave/valor, donde se utilizan las claves para acceder a los elementos en oposición a la posición, como se hace con las listas, por ejemplo.

En este artículo veremos como concatenar (combinar) dos diccionarios de Python.

El método Update()

Digamos que tenemos los siguientes diccionarios.

dict1 = {'bookA': 1, 'bookB': 2, 'bookC': 3}
dict2 = {'bookC': 2, 'bookD': 4, 'bookE': 5}

¿Cómo podemos combinar estos dos diccionarios en un único diccionario? Podemos utilizar la función update para estos menesteres. Según la documentación de Python...

Update the dictionary with the key/value pairs from other, overwriting existing keys. Return None.

update() accepts either another dictionary object or an iterable of key/value pairs (as tuples or other iterables of length two). If keyword arguments are specified, the dictionary is then updated with those key/value pairs: d.update(red=1, blue=2).

Por lo tanto, para combinar sendos diccionarios, podemos implementar lo siguiente:

dict2.update(dict1)

Digamos que has escrito la siguiente sentencia para ver los resultados:

print dict2.update(dict1)

En ese caso obtendrás un None como una catedral. Esto es debido a que la función update() no devuelve un nuevo diccionario. Para obtener el resultado de la concatenación, simplemente escribe lo siguiente:

print dict2

En cuyo caso, obtendrás la siguiente salida:

{'bookA': 1, 'bookB': 2, 'bookC': 3, 'bookD': 4, 'bookE': 5}

¿Y si hacemos lo siguiente?

dict1.update(dict2)
print dict1

En este caso, obtendrás la siguiente salida:

{'bookA': 1, 'bookB': 2, 'bookC': 2, 'bookD': 4, 'bookE': 5}

Date cuenta que en el primer ejemplo, dict2.update(dict1), modificamos el diccionario dict2 con los pares clave/valor de dict1, y sobreescribimos las claves coincidentes. La clave coincidente, como habrás notado es 'bookC', que ahora tendrá el valor 3, una vez que hemos actualizado los pares de clave/valor de dict1. Esto será al revés en el segundo ejemplo, con dict1.update(dict2) modificaremso el diccionario dict1 con los pares de clave/valor de dict2.

De todas maneras, existe un problema con el uso de update() para combinar dos diccionarios. El problema radica en el hecho de que el diccionario original puede ser modificado. En otras palabras, en el primer caso, por ejemplo, dict2.update(dict1), la versión original de dict2 podría ser modificada, y en este último caso, dict1.update(dict2), la versión original de dict1 podría ser modificada. Es decir, se puede utilizar update() para combinar dos diccionarios, si no estás interesado en mantener la versión original del diccionario que quieres actualizar.

Combinando dos diccionarios con una única sentencia

Existe otro método que puedes utilizar para combinar dos diccionarios. Lo mejor de todo es que se puede implementar con una única sentencia, tal que así:

print dict(dict2, **dict1)

La salida a la anterior sentencia es:

{'bookA': 1, 'bookB': 2, 'bookC': 3, 'bookD': 4, 'bookE': 5}

Por lo tanto, dict1 sobreescribe dict2. Si queremos que dict2 sobreescriba dict1, escribimos:

print dict(dict1, **dict2)

La salida a la anterior sentencia sería:

{'bookA': 1, 'bookB': 2, 'bookC': 2, 'bookD': 4, 'bookE': 5}

Conservando los pares de clave/valor

Volviendo a la cuestión anterior de mantener los pares de clave/valor, ¿cómo podemos combinar dos diccionarios, manteniendo los originales de cada diccionario?

Una solución para esto puede ser el siguiente (tomado de una respuesta en este hilo StackOverflow):

from itertools import chain
from collections import defaultdict
dict1 = {'bookA': 1, 'bookB': 2, 'bookC': 3}
dict2 = {'bookC': 2, 'bookD': 4, 'bookE': 5}
dict3 = defaultdict(list)
for k, v in chain(dict1.items(), dict2.items()):
    dict3[k].append(v)
 
for k, v in dict3.items():
    print(k, v)

La salida a todo esto sería:

('bookA', [1])
('bookB', [2])
('bookC', [3, 2])
('bookD', [4])
('bookE', [5])

Por lo tanto, como puedes ver en este tutorial, es muy fácil combinar dos diccionarios utilizando Python. Esto se convierte en un poco más complejo si queremos mantener los valores de la misma clave en cada diccionario.

Fuente: Abder-Rahman Ali

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP