2011-09-30 7 views
7

90.000'den fazla giriş içeren büyük bir python sözlüğüm var. Giriş yapmayacağım nedenlerden dolayı, bu sözlüğü veritabanımda saklamalıyım ve daha sonra bir sonraki noktada veritabanı girişlerinden sözlüğü yeniden derlemeliyim.İki Büyük Python Sözlüklerinin Eşdeğer Olup Olmadığını Kontrol Etme

Depolama ve yeniden derlememimin güvenilir olduğunu ve yeni sözlüğümün eskisine eşit olduğunu doğrulamak için bir yordam hazırlamaya çalışıyorum. Bunu test etmek için en iyi metodoloji hangisidir?

Küçük farklılıklar var ve ne olduklarını bulmak istiyorum.

+1

tüm değerler ise ihtiyaçlarınızın uyacak şekilde ince ayar olabilir, sadece dict1 == dict2 – Thomas

+0

'yeni == old' ... –

+0

çalışması gerekir Bazı küçük problemlerin olabileceğini varsayalım ve küçük problemler varsa ne olduklarını, yani farklılıkların ne olduğunu bilmek istiyorum. – Spencer

cevap

10

en belirgin yaklaşım elbette:

o karşılaştırma yapmak Python'un iç yapıları dayandığından mümkün olan en hızlı olmalı
if oldDict != newDict: 
    print "**Failure to rebuild, new dictionary is different from the old" 

.

UPDATE: Görünüşe göre "eşit" değil, ama daha zayıf bir şey. Sorunuzu, "eşdeğer" olarak ne düşündüğünüzü açıklığa kavuşturmak için düzenlemeniz gerektiğini düşünüyorum.

+0

Bunu denedim ve farklılıklar var. Bu farklılıkların ne olduğunu bilmeme izin veren bir prosedür kurmak istiyorum. – Spencer

+8

@Peter, "Bu farklılıkların ne olduğunu bilmeme izin veren bir prosedürü" sormak istediğinizde, bu cevabı neden kabul edildi olarak işaretlemelisiniz? – agf

+0

ve yuvalanmış nesneleriniz varsa, ilkel olmayanlar – 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)]) 

Düzenleme Bu yanıt için oy vermeyin. Fast comparison between two Python dictionary adresine gidin ve bir not ekleyin. Bu çok eksiksiz bir çözümdür.

+0

Diğer yayınlar, "iteritems" işlevini kullanmaz. Bu yaklaşımı daha çok seviyorum. – sholsapp

2

Sen denklik tanımladınız böyle bir şey ile başlamak ve

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