Saltar al contenido

¿Cómo obtener la diferencia entre dos diccionarios en Python?

Solución:

Creo que es mejor usar la operación de diferencia simétrica de conjuntos para hacer eso. Aquí está el enlace al documento.

>>> dict1 = {1:'donkey', 2:'chicken', 3:'dog'}
>>> dict2 = {1:'donkey', 2:'chimpansee', 4:'chicken'}
>>> set1 = set(dict1.items())
>>> set2 = set(dict2.items())
>>> set1 ^ set2
{(2, 'chimpansee'), (4, 'chicken'), (2, 'chicken'), (3, 'dog')}

Es simétrico porque:

>>> set2 ^ set1
{(2, 'chimpansee'), (4, 'chicken'), (2, 'chicken'), (3, 'dog')}

Este no es el caso cuando se usa el operador de diferencia.

>>> set1 - set2
{(2, 'chicken'), (3, 'dog')}
>>> set2 - set1
{(2, 'chimpansee'), (4, 'chicken')}

Sin embargo, puede que no sea una buena idea convertir el conjunto resultante en un diccionario porque puede perder información:

>>> dict(set1 ^ set2)
{2: 'chicken', 3: 'dog', 4: 'chicken'}

Pruebe el siguiente fragmento, utilizando una comprensión de diccionario:

value = { k : second_dict[k] for k in set(second_dict) - set(first_dict) }

En el código anterior encontramos la diferencia de las llaves y luego reconstruir un dict tomando los valores correspondientes.

Otra solucion seria dictdiffer (https://github.com/inveniosoftware/dictdiffer).

import dictdiffer                                          

a_dict = {                                                 
  'a': 'foo',
  'b': 'bar',
  'd': 'barfoo'
}                                                          

b_dict = {                                                 
  'a': 'foo',                                              
  'b': 'BAR',
  'c': 'foobar'
}                                                          

for diff in list(dictdiffer.diff(a_dict, b_dict)):         
    print diff

Un diff es una tupla con el tipo de cambio, el valor cambiado y la ruta a la entrada.

('change', 'b', ('bar', 'BAR'))
('add', '', [('c', 'foobar')])
('remove', '', [('d', 'barfoo')])
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *