2011-09-30 17 views
7

Ho un enorme dizionario Python con oltre 90.000 voci. Per motivi per cui non entrerò, ho bisogno di memorizzare questo dizionario nel mio database e poi in un secondo momento ricompilare il dizionario dalle voci del database.Controllare se due dizionari di Python massivi sono equivalenti

Sto tentando di impostare una procedura per verificare che il mio archivio e la mia ricompilazione siano fedeli e che il mio nuovo dizionario sia equivalente a quello vecchio. Qual è la migliore metodologia per testare questo.

Ci sono piccole differenze e voglio capire quali sono.

+1

Se i valori sono tutti equivalenza definita, basta dict1 == dict2 dovrebbero lavorare – Thomas

+0

'nuova == old' ... –

+0

Suppongo che potrebbero esserci alcuni problemi minori, e se ci sono problemi minori, voglio sapere quali sono, cioè quali sono le differenze. – Spencer

risposta

10

L'approccio più ovvio è naturalmente:

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

Questo dovrebbe essere il più veloce possibile, dato che si basa su interni di Python per fare il confronto.

UPDATE: Sembra che tu non stia cercando "uguale", ma qualcosa di più debole. Penso che sia necessario modificare la domanda per chiarire cosa si intende per "equivalente".

+0

Ho provato questo e ci sono differenze. Voglio impostare una procedura che mi consenta di sapere quali sono queste differenze. – Spencer

+8

@Peter se si desidera "impostare una procedura che mi consenta di sapere quali sono queste differenze" che ritengo sia chiara nella domanda, perché contrassegnare questa risposta come accettata? – agf

+0

e se si hanno oggetti nidificati, non primitive – 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)]) 

Modifica Non votare per questa risposta. Vai a Fast comparison between two Python dictionary e aggiungi un upvote. È una soluzione molto completa.

+0

Altri post non usa 'iteritems'. Mi piace questo approccio migliore. – sholsapp

2

Si potrebbe iniziare con qualcosa di simile e modificarlo in base alle proprie esigenze

>>> 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()) 
Problemi correlati