2011-09-30 17 views
7

Tengo un diccionario de Python masivo con más de 90,000 entradas. Por razones que no entraré, necesito almacenar este diccionario en mi base de datos y luego en un punto posterior recompilar el diccionario de las entradas de la base de datos.Comprobando si dos diccionarios Massive Python son equivalentes

Estoy tratando de configurar un procedimiento para verificar que mi almacenamiento y recompilación fue fiel y que mi nuevo diccionario es equivalente al anterior. ¿Cuál es la mejor metodología para probar esto?

Existen pequeñas diferencias y quiero descubrir cuáles son.

+1

Si sus valores de equivalencia todos han definido, simplemente dict1 == dict2 deben trabajar – Thomas

+0

'nueva == old' ... –

+0

Estoy asumiendo que podría haber algunos problemas menores, y si hay problemas menores, quiero saber cuáles son, es decir, cuáles son las diferencias. – Spencer

Respuesta

10

El método más obvio es, por supuesto:

if oldDict != newDict: 
    print "**Failure to rebuild, new dictionary is different from the old" 

Eso debería ser el más rápido posible, ya que se basa en el funcionamiento interno de Python para hacer la comparación.

ACTUALIZACIÓN: Parece que no buscas "igual", pero algo más débil. Creo que debes editar tu pregunta para dejar en claro lo que consideras "equivalente".

+0

He intentado esto y hay diferencias. Quiero configurar un procedimiento que me permita saber cuáles son esas diferencias. – Spencer

+8

@Peter si desea "configurar un procedimiento que me permita saber cuáles son esas diferencias", lo cual creo que fue claro en su pregunta, ¿por qué marcaría esta respuesta como aceptada? – agf

+0

y qué ocurre si tiene objetos anidados, no primitivas – dtc

1
>>> d1 = {'a':1,'b':2,'c':3} 
>>> d2 = {'b':2,'x':2,'a':5} 
>>> set(d1.iteritems()) - set(d2.iteritems()) # items in d1 not in d2 
set([('a', 1), ('c', 3)]) 
>>> set(d2.iteritems()) - set(d1.iteritems()) # items in d2 not in d1 
set([('x', 2), ('a', 5)]) 

Editar no votan por esta respuesta. Vaya a Fast comparison between two Python dictionary y agregue un voto positivo. Es una solución muy completa.

+0

Otra publicación no utiliza 'iteritems'. Me gusta este enfoque mejor. – sholsapp

2

Se podría empezar con algo como esto y modificarlo para que se adapte a sus necesidades

>>> bigd = dict([(x, random.randint(0, 1024)) for x in xrange(90000)]) 
>>> bigd2 = dict([(x, random.randint(0, 1024)) for x in xrange(90000)]) 
>>> dif = set(bigd.items()) - set(bigd2.items()) 
Cuestiones relacionadas