2011-09-30 16 views
7

Mam ogromny słownik python z ponad 90 000 wpisów. Z powodów, których nie będę mógł uzyskać, muszę przechowywać ten słownik w mojej bazie danych, a następnie w późniejszym czasie przekompilować słownik z wpisów w bazie danych.Sprawdzanie, czy dwa masywne słowniki w języku Python są odpowiednikami

Próbuję skonfigurować procedurę sprawdzania, czy moje przechowywanie i rekompilacja były wierne i że mój nowy słownik jest równoważny ze starym. Jaka jest najlepsza metodologia do testowania tego.

Istnieją drobne różnice i chcę dowiedzieć się, jakie one są.

+1

Jeśli wartościami wszyscy równoważności określone, tylko dict1 == dict2 powinien działać – Thomas

+0

'nowy == old' ... –

+0

Zakładam, że mogą pojawić się drobne problemy, a jeśli występują drobne problemy, chcę wiedzieć, czym one są, tj. Jakie są różnice. – Spencer

Odpowiedz

10

Najbardziej oczywistym rozwiązaniem jest oczywiście:

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

To powinno być jak najszybsze, ponieważ opiera się na wewnętrznych Pythona zrobić porównanie.

UPDATE: Wygląda na to, że nie jesteś po "równy", ale coś słabszego. Myślę, że musisz edytować swoje pytanie, aby jasno określić, co uważasz za "równoważny".

+0

Próbowałem tego i są różnice. Chcę skonfigurować procedurę, która pozwoli mi dowiedzieć się, jakie są te różnice. – Spencer

+8

@Peter, jeśli chcesz "skonfigurować procedurę, która informuje mnie, jakie są różnice", co moim zdaniem było jasne w Twoim pytaniu, dlaczego uznałeś tę odpowiedź za zaakceptowaną? – agf

+0

i co jeśli masz zagnieżdżone obiekty, nie prymitywy – 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)]) 

Edit nie głosować na tą odpowiedź. Idź do Fast comparison between two Python dictionary i dodaj upto. Jest to bardzo kompletne rozwiązanie.

+0

Inny post nie używa 'iteritems'. Lubię to podejście lepiej. – sholsapp

2

Można zacząć z czymś takim i dostosować go do własnych potrzeb

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