Intersección y diferencia de dos diccionarios.

Dados dos diccionarios, quiero ver su intersección y diferencia y realizar la función f en los elementos que se intersecan y realizar g en los elementos únicos. Así es como descubrí cuáles son los elementos únicos e intersecantes donde d1 y d2 son dos diccionarios. ¿Cómo imprimo d_intersection y d_difference como diccionarios dentro de una tupla? La salida debería tener un aspecto similar al siguiente ({claves de intersección, valores}, {claves de diferencia, valores}) por ejemplo: dado

d1 = {1:30, 2:20, 3:30, 5:80} d2 = {1:40, 2:50, 3:60, 4:70, 6:90} 

La salida debe ser ({1: 70, 2: 70, 3: 90}, {4: 70, 5: 80, 6: 90})

 dic = {} d_intersect = set(d1) & set(d2) d_difference = set(d1) ^ set(d2) for i in d_intersect: dic.update({i : f(d1[i],d2[i])}) for j in d_difference: dic.update({j : g(d1[j],d2[j])}) 

¿Alguien puede decirme dónde me fue mal y por qué mi código muestra el error clave 4?

Aquí hay una forma de hacerlo, aunque puede haber un método más eficiente.

 d1 = {1:30, 2:20, 3:30, 5:80} d2 = {1:40, 2:50, 3:60, 4:70, 6:90} d_intersect = {} # Keys that appear in both dictionaries. d_difference = {} # Unique keys that appear in only one dictionary. # Get all keys from both dictionaries. # Convert it into a set so that we don't loop through duplicate keys. all_keys = set(d1.keys() + d2.keys()) # Python2.7 #all_keys = set(list(d1.keys()) + list(d2.keys())) # Python3.3 for key in all_keys: if key in d1 and key in d2: # If the key appears in both dictionaries, add both values # together and place it in intersect. d_intersect[key] = d1[key] + d2[key] else: # Otherwise find out the dictionary it comes from and place # it in difference. if key in d1: d_difference[key] = d1[key] else: d_difference[key] = d2[key] 

Salida:

{1: 70, 2: 70, 3: 90}

{4: 70, 5: 80, 6: 90}

Obtienes un KeyError para 4 cuando ^ busca la diferencia simétrica, lo que significa que las claves son únicas para cualquiera de los dos , las claves no están en ambos. Tampoco necesita crear conjuntos, puede usar el objeto de vista devuelto de las llamadas .keys

 d1 = {1: 30, 2: 20, 3: 30, 5: 80} d2 = {1: 40, 2: 50, 3: 60, 4: 70, 6: 90} # d1.keys() ^ d2 -> {4, 5, 6}, 4, 6 unique to d2, 5 unique to d1. symm = {k: d1.get(k, d2.get(k)) for k in d1.keys() ^ d2} inter = {k: d2[k] + d1[k] for k in d1.keys() & d2} 

d1.get(k, d2.get(k)) funciona para la diferencia simétrica cuando se detecta cuando obtenemos una clave única de d2 .

El código para python2 es ligeramente diferente, necesitarías reemplazar .keys con .viewkeys para obtener un objeto de vista :

  {k: d1.get(k, d2.get(k)) for k in d1.viewkeys() ^ d2} {k: d2[k] + d1[k] for k in d1.viewkeys() & d2} 

Para obtener la diferencia justa entre dos conjuntos, es decir, lo que está en a pero no en b, necesita:

 In [1]: d1 = {1: 30, 2: 20, 3: 30, 5: 80} In [2]: d2 = {1: 40, 2: 50, 3: 60, 4: 70, 6: 90} In [3]: {k: d2[k] for k in d2.keys() - d1} Out[3]: {4: 70, 6: 90} In [4]: {k: d1[k] for k in d1.keys() - d2} Out[4]: {5: 80} In [5]: d2.keys() - d1 # in d2 not in d1 Out[5]: {4, 6} In [6]: d1.keys() - d2 # in d1 not in d2 Out[6]: {5} In [7]: d1.keys() ^ d2 # unique to either Out[7]: {4, 5, 6} 

La diferencia simétrica es como hacer la unión de las diferencias:

 In [12]: d1.keys() - d2 | d2.keys() - d1 Out[12]: {4, 5, 6} 

Todos los operadores se discuten en los documentos de Python, también la página wiki en Set_ (Matemáticas) le da una buena visión general.