2011-09-30 3 views
7

J'ai un dictionnaire python massif avec plus de 90 000 entrées. Pour des raisons que je n'aborderai pas, j'ai besoin de stocker ce dictionnaire dans ma base de données, puis de recompiler le dictionnaire à partir des entrées de la base de données.Vérification si deux dictionnaires Python massifs sont équivalents

J'essaye de mettre en place une procédure pour vérifier que mon stockage et recompilation était fidèle et que mon nouveau dictionnaire est équivalent à l'ancien. Quelle est la meilleure méthodologie pour tester cela?

Il existe des différences mineures et je veux savoir ce qu'ils sont.

+1

Si vos valeurs tous ont défini l'équivalence, juste Dict1 == DICT2 doivent travailler – Thomas

+0

'nouveau == old' ... –

+0

Je suppose qu'il pourrait y avoir quelques problèmes mineurs, et s'il y a des problèmes mineurs, je veux savoir ce qu'ils sont, c'est-à-dire quelles sont les différences. – Spencer

Répondre

10

L'approche la plus évidente est bien sûr:

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

Cela devrait être le plus rapide possible, puisqu'il repose sur les composants internes de Python pour faire la comparaison.

MISE À JOUR: Il semble que vous ne soyez pas "égal", mais quelque chose de plus faible. Je pense que vous devez éditer votre question pour clarifier ce que vous considérez comme «équivalent».

+0

J'ai essayé cela et il y a des différences. Je veux mettre en place une procédure qui me permet de savoir quelles sont ces différences. – Spencer

+8

@Peter si vous voulez "mettre en place une procédure qui me permet de savoir quelles sont ces différences", ce que je pense était clair dans votre question, pourquoi marqueriez-vous cette réponse comme acceptée? – agf

+0

et si vous avez des objets imbriqués, pas des primitives – 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)]) 

Modifier Ne votez pas pour cette réponse. Aller au Fast comparison between two Python dictionary et ajouter un upvote. C'est une solution très complète.

+0

Les autres publications n'utilisent pas 'iteritems'. J'aime mieux cette approche. – sholsapp

2

Vous pourriez commencer par quelque chose comme ça et apportez des modifications pour répondre à vos besoins

>>> 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()) 
Questions connexes