¿Cuál es la mejor manera de extender un diccionario con otro? Por ejemplo:
>>> a = { "a" : 1, "b" : 2 }
>>> b = { "c" : 3, "d" : 4 }
>>> a
{'a': 1, 'b': 2}
>>> b
{'c': 3, 'd': 4}
Estoy buscando cualquier operación para obtener este for
bucle de evitación :
{ "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
Deseo hacer algo como:
a.extend(b) # This does not work
python
dictionary
FerranB
fuente
fuente
Respuestas:
Documentación más reciente de la biblioteca estándar de Python
fuente
{"a":2, "b":3}
con dict{"b":4, "c":5}
a dict{"a":2, "b":3,"c":5}
? Por supuesto, es posible usarloupdate()
moviendo algunas cosas, pero sería mejor si se pudiera lograr en una sola línea ...update
sobrescribe silenciosamente las entradas existentes. Es decir, cualquier valor enb
sobrescribir aquellos ena
las teclas superpuestas.Una hermosa joya en esta pregunta cerrada :
La "forma de línea", sin alterar ninguno de los dictados de entrada, es
Aprende lo que
**basket_two
(el**
) significa aquí .En caso de conflicto, los elementos de
basket_two
anularán los debasket_one
. A medida que avanza una frase, esto es bastante legible y transparente, y no tengo reparo en usarlo cada vez que un dict que es una mezcla de otros dos es útil (cualquier lector que tenga problemas para entenderlo, de hecho, será muy bien servido por la forma en que esto lo impulsa a aprenderdict
y la**
forma ;-). Entonces, por ejemplo, usa como:son ocurrencias razonablemente frecuentes en mi código.
Originalmente presentado por Alex Martelli
Nota: En Python 3, esto solo funcionará si cada clave en basket_two es a
string
.fuente
dict
es fácil de encontrar mientras que**
es un poco más complicada (la palabra clave es kwargs ). Aquí hay una buena explicación: saltycrane.com/blog/2008/01/…basket_one.update(<dict>)
como su nombre lo indica, actualiza un diccionario existente (o uno clonado).**anotherdict
, deben ser cadenas.¿Has intentado usar la comprensión del diccionario con el mapeo del diccionario?
Otra forma de hacerlo es mediante el uso de dict (iterable, ** kwarg)
En Python 3.9 puede agregar dos dict usando union | operador
fuente
Agregará claves y valores de b a a , sobrescribiendo si ya hay un valor para una clave.
fuente
Como otros han mencionado,
a.update(b)
para algunos dictadosa
yb
logrará el resultado que ha pedido en su pregunta. Sin embargo, quiero señalar que muchas veces he visto que elextend
método de mapear / establecer objetos desea que en la sintaxisa.extend(b)
,a
los valores de NO se sobrescriban conb
los valores de.a.update(b)
sobrescribea
los valores, por lo que no es una buena opción paraextend
.Tenga en cuenta que algunos idiomas llaman a este método
defaults
oinject
, ya que puede considerarse como una forma de inyectar los valores de b (que podrían ser un conjunto de valores predeterminados) en un diccionario sin sobrescribir los valores que ya podrían existir.Por supuesto, podrías notar que
a.extend(b)
es casi lo mismo queb.update(a); a=b
. Para eliminar la asignación, puede hacerlo así:Gracias a Tom Leys por esa idea inteligente usando un
dict
constructor sin efectos secundariosextend
.fuente
También puede usar las colecciones de Python. Chainmap que se introdujo en Python 3.3.
Esto tiene algunas ventajas posibles, dependiendo de su caso de uso. Se explican con más detalle aquí , pero voy a dar una breve descripción:
Esto lo hace principalmente útil para cosas como diccionarios de configuración.
fuente
En caso de que lo necesite como clase , puede extenderlo con dict y usar el método de actualización :
fuente