() translation by (you can also view the original English article)
En un tutorial anterior, aprendimos sobre los diccionarios de Python, y vimos que se consideran conjuntos no ordenados con un par key/value
, donde las claves se utilizan para acceder a los elementos en lugar de la posición, como en las listas, por ejemplo.
En este consejo breve, voy a enseñarte cómo concatenar (fusionar) dos diccionarios juntos.
El método Update()
Supongamos que tenemos los siguientes dos diccionarios:
1 |
dict1 = {'bookA': 1, 'bookB': 2, 'bookC': 3} dict2 = {'bookC': 2, 'bookD': 4, 'bookE': 5} |
¿Cómo podemos fusionar esos dos diccionarios en uno solo? Una función que podemos utilizar en este contexto es update([other])
. Como se indica en la documentación de Python:
Actualiza el diccionario con los pares key/value de otro, sobrescribiendo las claves existentes. Return
None
.
update()
acepta otro objeto de diccionario o un iterable de pares key/value (como tuplas u otros iterables de longitud dos). Si se especifican los argumentos de las palabras clave, el diccionario se actualiza con esos pares key/value:d.update(red=1, blue=2)
.
Así que, para fusionar los dos diccionarios anteriores, podemos escribir lo siguiente:
dict2.update(dict1)
Digamos que has escrito la siguiente declaración para ver los resultados:
print dict2.update(dict1)
¡En este caso obtendrás None
! Esto se debe a que la función update()
no devuelve un diccionario nuevo. Para obtener el resultado de la concatenación, simplemente escribe lo siguiente:
print dict2
En este caso, obtendrás el siguiente resultado:
{'bookA': 1, 'bookB': 2, 'bookC': 3, 'bookD': 4, 'bookE': 5}
¿Y si hiciéramos lo siguiente?
1 |
dict1.update(dict2) print dict1 |
En tal caso, obtendrás el siguiente resultado:
{'bookA': 1, 'bookB': 2, 'bookC': 2, 'bookD': 4, 'bookE': 5}
Observa que en el primer caso, dict2.update (dict1)
, actualizamos el diccionario dict2
con los pares key/value de dict1
y sobrescribimos las claves existentes. Como podemos notar, la clave existente es 'bookC
', que en este caso tendrá el valor 3
, ya que estamos actualizando con los pares key/value de dict1
. Esto se invertirá en el último caso, dict1.update(dict2)
, donde estamos actualizando el diccionario dict1
con pares key/value de dict2
.
No obstante, hay un problema en el uso de update()
para fusionar dos diccionarios. El problema radica en el hecho de que el diccionario original puede ser modificado. Dicho de otra forma, en el primer caso, por ejemplo, dict2.update(dict1)
, la versión original de dict2
podría ser modificada, y en el último caso, dict1.update(dict2)
, la versión original de dict1
podría ser modificada. Es decir, puedes utilizar update()
para fusionar dos diccionarios si no estás interesado en mantener la versión original del diccionario que necesitas actualizar. Con la versión original aquí me refiero a conservar el valor de la clave.
Fusionando dos diccionarios en una sola expresión
Otro método que se puede utilizar para fusionar dos diccionarios, donde puedes realizar tal tarea en una sola expresión, es el siguiente:
print dict(dict2, **dict1)
El resultado de esta declaración es:
{'bookA': 1, 'bookB': 2, 'bookC': 3, 'bookD': 4, 'bookE': 5}
De este modo, dict1
anula dict2
. Si queremos que dict2
anule dict1
, escribimos:
print dict(dict1, **dict2)
El resultado en este caso sería:
{'bookA': 1, 'bookB': 2, 'bookC': 2, 'bookD': 4, 'bookE': 5}
Conservando los valores clave
Regresando al problema anterior sobre la conservación de los valores clave, ¿cómo podemos fusionar dos diccionarios mientras se conservan los originales de cada uno de ellos?
Una solución alternativa para esto puede ser la siguiente (tomada de la respuesta en este hilo de StackOverflow):
1 |
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) |
El resultado en este caso será:
1 |
('bookA', [1]) ('bookB', [2]) ('bookC', [3, 2]) ('bookD', [4]) ('bookE', [5]) |
Así que, como puedes ver en este consejo breve, es muy fácil fusionar dos diccionarios utilizando Python, y se vuelve un poco más complejo si queremos mantener los valores de la misma clave en cada diccionario.