2011-09-30 5 views
7

나는 90,000 개가 넘는 항목으로 구성된 방대한 파이썬 사전을 가지고 있습니다. 내가 들어 가지 않을 이유 때문에이 사전을 데이터베이스에 저장 한 다음 나중에 데이터베이스 항목에서 사전을 다시 컴파일해야합니다.대용량 파이썬 사전 두 개가 동등한 지 확인하기

저장 장치 및 재 컴파일이 충실하고 새 사전이 이전 것과 동일하다는 것을 확인하기위한 절차를 설정하려고합니다. 이것을 테스트하는 가장 좋은 방법은 무엇입니까?

사소한 차이점이 있으며 무엇인지 파악하고 싶습니다.

+1

모든 값의 경우 사용자의 요구에 맞도록 조정할 수 있습니다, 단지 dict1 == dict2는 – Thomas

+0

'새 == old' ... –

+0

작동합니다 약간의 사소한 문제가있을 수 있다고 가정하고 있습니다. 사소한 문제가있는 경우 그 차이점을 알고 싶습니다. – Spencer

답변

10

가장 확실한 방법은 물론이다

는 비교를 할 파이썬의 내부에 의존하기 때문에, 가장 빠른되어야한다
if oldDict != newDict: 
    print "**Failure to rebuild, new dictionary is different from the old" 

.

업데이트 : "평등"을 따르지는 않았지만 약한 것 같습니다. 나는 당신이 당신의 질문을 편집하여 "동등"하다고 생각하는 것이 무엇인지 분명하게해야한다고 생각합니다.

+0

나는 이것을 시도하고 차이점이있다. 나는 그 차이가 무엇인지 알 수있는 절차를 준비하고 싶다. – Spencer

+8

@Peter 질문에 명확하다고 생각되는 차이점을 알려주는 절차를 설정하려면 왜이 대답을 허용으로 표시 하시겠습니까? – agf

+0

그리고 만약 당신이 원시 객체가 아닌 중첩 된 객체를 가지고 있다면 – 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)]) 

편집 이 대답을 투표하지 마십시오. Fast comparison between two Python dictionary으로 이동하여 upvote를 추가하십시오. 매우 완벽한 솔루션입니다.

+0

다른 포스트는'iteritems'을 사용하지 않습니다. 나는이 접근법을 더 좋아한다. – sholsapp

2

당신은 등가 정의 같은 것을 시작하고

>>> 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()) 
관련 문제