Python: el diccionario se fusiona actualizando pero no sobrescribiendo si existe un valor

Si tengo 2 dicts como sigue:

d1 = {('unit1','test1'):2,('unit1','test2'):4} d2 = {('unit1','test1'):2,('unit1','test2'):''} 

Para ‘fusionarlos’:

 z = dict(d1.items() + d2.items()) z = {('unit1','test1'):2,('unit1','test2'):''} 

Funciona bien. Además, ¿qué hacer, si me gustaría comparar cada valor de dos diccionarios y solo actualizar d2 en d1 si los valores en d1 están vacíos / Ninguno / ”?

[EDITAR] Pregunta: Al actualizar d2 en d1, cuando existe la misma clave, me gustaría mantener solo el valor numérico (ya sea de d1 o d2) en lugar de un valor vacío. Si ambos valores están vacíos, entonces no hay problemas para mantener el valor vacío. Si ambos tienen valores, entonces el valor d1 debería permanecer. 🙂 (muchísima si-si no … me probaría mientras tanto)

es decir

 d1 = {('unit1','test1'):2,('unit1','test2'):8,('unit1','test3'):''} d2 = {('unit1','test1'):2,('unit1','test2'):'',('unit1','test3'):''} #compare & update codes z = {('unit1','test1'):2,('unit1','test2'):8, ('unit1','test2'):''} # 8 not overwritten by empty. 

por favor ayudar a sugerir

Gracias.

Solo cambia el orden:

 z = dict(d2.items() + d1.items()) 

Por cierto, también puede estar interesado en el método de update potencialmente más rápido.

En Python 3, primero debe convertir los objetos de la vista en listas:

 z = dict(list(d2.items()) + list(d1.items())) 

Si desea cadenas especiales vacías, puede hacer lo siguiente:

 def mergeDictsOverwriteEmpty(d1, d2): res = d2.copy() for k,v in d2.items(): if k not in d1 or d1[k] == '': res[k] = v return res 

Python 2.7. Actualiza d2 con pares clave / valor d1, pero solo si el valor d1 no es Ninguno, ” (Falso):

 >>> d1 = dict(a=1,b=None,c=2) >>> d2 = dict(a=None,b=2,c=1) >>> d2.update({k:v for k,v in d1.iteritems() if v}) >>> d2 {'a': 1, 'c': 2, 'b': 2} 

d2.update(d1) lugar de dict(d2.items() + d1.items())

Aquí hay una solución in situ (modifica d2):

 # assumptions: d2 is a temporary dict that can be discarded # d1 is a dict that must be modified in place # the modification is adding keys from d2 into d1 that do not exist in d1. def update_non_existing_inplace(original_dict, to_add): to_add.update(original_dict) # to_add now holds the "final result" (O(n)) original_dict.clear() # erase original_dict in-place (O(1)) original_dict.update(to_add) # original_dict now holds the "final result" (O(n)) return 

Aquí hay otra solución in situ , que es menos elegante pero potencialmente más eficiente, además de dejar d2 sin modificar :

 # assumptions: d2 is can not be modified # d1 is a dict that must be modified in place # the modification is adding keys from d2 into d1 that do not exist in d1. def update_non_existing_inplace(original_dict, to_add): for key in to_add.iterkeys(): if key not in original_dict: original_dict[key] = to_add[key] 

Para agregar a d2 claves / valores de d1 que no existen en d2 sin sobrescribir las claves / valores existentes en d2 :

 temp = d2.copy() d2.update(d1) d2.update(temp) 

En caso de que tenga diccionarios con el mismo tamaño y claves, puede utilizar el siguiente código:

 dict((k,v if k in d2 and d2[k] in [None, ''] else d2[k]) for k,v in d1.iteritems())