¿Agregar diccionario a un diccionario?

Tengo dos diccionarios existentes y deseo ‘anexar’ uno de ellos al otro. Con esto quiero decir que la clave, los valores del otro diccionario deben hacerse en el primer diccionario. Por ejemplo:

orig = { 'A': 1, 'B': 2, 'C': 3, } extra = { 'D': 4, 'E': 5, } dest = # something here involving orig and extra print dest { 'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5 } 

Creo que todo esto se puede lograr a través de un bucle for (¿quizás?), Pero ¿hay algún método de diccionarios o cualquier otro módulo que me guarde este trabajo? Los diccionarios reales que estoy usando son realmente grandes …

Tu puedes hacer

 orig.update(extra) 

o, si no desea que se modifique orig , haga una copia primero:

 dest = dict(orig) # or orig.copy() dest.update(extra) 

Tenga en cuenta que si extra y orig tienen teclas superpuestas, el valor final se tomará de extra. Por ejemplo,

 >>> d1 = {1: 1, 2: 2} >>> d2 = {2: 'ha!', 3: 3} >>> d1.update(d2) >>> d1 {1: 1, 2: 'ha!', 3: 3} 

La forma más python (y ligeramente más rápida) de lograr esto es mediante:

 dest = {**orig, **extra} 

O, dependiendo del problema a resolver, tal vez:

 dest = {**orig, 'D': 4, 'E': 5} 

Suponiendo que no desea cambiar el orig , puede hacer una copia y actualizar como las otras respuestas, o puede crear un nuevo diccionario en un solo paso pasando todos los elementos de ambos diccionarios al constructor de dict:

 from itertools import chain dest = dict(chain(orig.items(), extra.items())) 

O sin itertools:

 dest = dict(list(orig.items()) + list(extra.items())) 

Tenga en cuenta que solo necesita pasar el resultado de los items() a la list() en Python 3, en 2.x dict.items() ya devuelve una lista por lo que solo puede hacer dict(orig.items() + extra.items()) .

Como un caso de uso más general, digamos que tiene una lista más grande de dictados que desea combinar en un solo dictado, podría hacer algo como esto:

 from itertools import chain dest = dict(chain.from_iterable(map(dict.items, list_of_dicts))) 

dict.update() parece que hará lo que quieras …

 >> orig.update(extra) >>> orig {'A': 1, 'C': 3, 'B': 2, 'E': 5, 'D': 4} >>> 

Tal vez, sin embargo, no quiera actualizar su diccionario original, pero trabaje en una copia:

 >>> dest = orig.copy() >>> dest.update(extra) >>> orig {'A': 1, 'C': 3, 'B': 2} >>> dest {'A': 1, 'C': 3, 'B': 2, 'E': 5, 'D': 4} 

Existe el método .update () 🙂

actualizar ([otro]) Actualiza el diccionario con los pares clave / valor de otros, sobrescribiendo las claves existentes. Devolver ninguno.

update () acepta otro objeto de diccionario o un iterable de pares clave / valor (como tuplas u otros iterables de longitud dos). Si se especifican argumentos de palabras clave, el diccionario se actualiza con esos pares clave / valor: d.update (rojo = 1, azul = 2).

Modificado en la versión 2.4: Permitió que el argumento fuera un iterable de pares clave / valor y permitiera argumentos de palabras clave.

La respuesta que quiero dar es “use collections.ChainMap”, pero acabo de descubrir que solo se agregó en Python 3.3: https://docs.python.org/3.3/library/collections.html#chainmap-objects

Puede intentar eliminar la clase de la fuente 3.3, aunque: http://hg.python.org/cpython/file/3.3/Lib/collections/ init .py # l763

Aquí hay una versión menos compatible con Python 2.x (el mismo autor): http://code.activestate.com/recipes/305268-chained-map-lookups/

En lugar de expandir / sobrescribir un diccionario con otro utilizando dict.merge, o crear una copia adicional combinando ambos, se crea una cadena de búsqueda que busca ambos en orden. Debido a que no duplica las asignaciones que envuelve, ChainMap usa muy poca memoria y ve las modificaciones posteriores a cualquier asignación secundaria. Debido a que el orden es importante, también puede usar la cadena para los valores predeterminados de la capa (es decir, las preferencias de usuario> config> env).

Un triplete para combinar o fusionar dos diccionarios:

 dest = {} dest.update(orig) dest.update(extra) 

Esto crea un nuevo diccionario sin modificar orig y extra .

Nota: Si una clave tiene diferentes valores en orig y extra , entonces sobresemplaza a orig .