keys - python dictionary of dictionaries
Python "extender" para un diccionario (5)
¿Has intentado usar la comprensión del diccionario con el mapeo del diccionario?
c = {**a, **b}
# c = { "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
¿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 bucle for
evitar:
{ "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
Deseo hacer algo como:
a.extend(b) # This does not work
Como han mencionado otros, a.update(b)
para algunos dictados a
y b
logrará el resultado que solicitó en su pregunta. Sin embargo, quiero señalar que muchas veces he visto que el método extend
de asignación / conjunto de objetos desea que, en la sintaxis a.extend(b)
, los valores de a NO deban ser sobrescritos por los valores de b
. a.update(b)
sobrescribe los valores de a, por lo que no es una buena opción para extend
.
Tenga en cuenta que algunos idiomas llaman a este método defaults
o inject
, ya que se puede considerar 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 existan.
Por supuesto, puede observar que a.extend(b)
es casi lo mismo que b.update(a); a=b
b.update(a); a=b
. Para eliminar la tarea, puedes hacerlo así:
def extend(a,b):
"""Create a new dictionary with a''s properties extended by b,
without overwriting.
>>> extend({''a'':1,''b'':2},{''b'':3,''c'':4})
{''a'': 1, ''c'': 4, ''b'': 2}
"""
return dict(b,**a)
Gracias a Tom Leys por esa idea inteligente utilizando un constructor de dict
sin efectos secundarios para extend
.
Una hermosa joya en esta pregunta cerrada :
El "modo oneliner", que no modifica ninguno de los dictados de entrada, es
basket = dict(basket_one, **basket_two)
Aprende lo que **basket_two
(el **
) significa aquí .
En caso de conflicto, los elementos de basket_two
los de basket_one
. A medida que avanzan los one-liners, esto es bastante legible y transparente, y no tengo reparos en usarlo en cualquier momento en que un dict que sea una mezcla de otros dos sea útil (cualquier lector que tenga problemas para entenderlo, de hecho, estará muy bien atendido por la forma en que esto lo incita a aprender sobre dict
y la forma **
;-). Así, por ejemplo, utiliza como:
x = mungesomedict(dict(adict, **anotherdict))
son ocurrencias razonablemente frecuentes en mi código.
Originalmente enviado por Alex Martelli
Nota: En Python 3, esto solo funcionará si cada clave en basket_two es una string
.
a.update(b)
Agregará claves y valores de b a a , sobrescribiendo si ya hay un valor para una clave.