2011-09-30 16 views
7

Tôi có từ điển python lớn với hơn 90.000 mục nhập không. Vì lý do tôi sẽ không nhận được vào, tôi cần phải lưu trữ từ điển này trong cơ sở dữ liệu của tôi và sau đó tại một thời điểm sau đó biên dịch lại từ điển từ các mục cơ sở dữ liệu.Kiểm tra xem hai Từ điển Python Massive có Tương đương

Tôi đang cố thiết lập quy trình để xác minh rằng dung lượng lưu trữ và biên dịch của tôi là trung thành và từ điển mới của tôi tương đương với từ điển cũ. Phương pháp tốt nhất để kiểm tra điều này là gì.

Có những khác biệt nhỏ và tôi muốn tìm ra chúng là gì.

+1

Nếu giá trị của bạn tất cả đều tương đương xác định, == dict2 chỉ dict1 nên làm việc – Thomas

+0

'mới == old' ... –

+0

Tôi giả định rằng có thể có một số vấn đề nhỏ, và nếu có những vấn đề nhỏ, tôi muốn biết những gì họ có nghĩa là sự khác biệt là gì. – Spencer

Trả lời

10

Cách tiếp cận rõ ràng nhất là tất nhiên:

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

Đó phải là nhanh nhất có thể, vì nó dựa trên internals Python để làm so sánh.

CẬP NHẬT: Có vẻ như bạn không theo "bình đẳng", nhưng điều gì đó yếu hơn. Tôi nghĩ bạn cần chỉnh sửa câu hỏi của mình để làm rõ điều bạn cho là "tương đương".

+0

Tôi đã thử điều này và có sự khác biệt. Tôi muốn thiết lập một quy trình cho phép tôi biết những khác biệt đó là gì. – Spencer

+8

@Peter nếu bạn muốn "thiết lập một quy trình cho phép tôi biết những khác biệt đó là gì" mà tôi nghĩ là rõ ràng trong câu hỏi của bạn, tại sao bạn đánh dấu câu trả lời này là được chấp nhận? – agf

+0

và nếu bạn có các đối tượng lồng nhau, không phải là nguyên thủy – 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)]) 

Sửa Đừng bỏ phiếu cho câu trả lời này. Truy cập Fast comparison between two Python dictionary và thêm một upvote. Nó là một giải pháp rất hoàn chỉnh.

+0

Bài đăng khác không sử dụng 'iteritems'. Tôi thích cách tiếp cận này tốt hơn. – sholsapp

2

Bạn có thể bắt đầu với một cái gì đó như thế này và tinh chỉnh nó cho phù hợp với nhu cầu của bạn

>>> 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()) 
Các vấn đề liên quan