2011-09-30 4 views
7

私は90,000以上のエントリを持つ巨大なpython辞書を持っています。私が入ることができない理由のために、私はこの辞書を自分のデータベースに格納し、後でデータベースエントリから辞書を再コンパイルする必要があります。2つの大規模なPython辞書が等価であるかどうかをチェック

私は自分のストレージと再コンパイルが忠実で、新しい辞書が古いものと同等であることを確認する手順を設定しようとしています。これをテストするための最良の方法は何ですか?

微妙な違いがあり、私はそれらが何であるか把握したいと思います。

+1

すべての値であれば、あなたのニーズに合うように微調整することができ、ちょうどdict1 == dict2は – Thomas

+0

'新しい== old' ... –

+0

を動作するはずですマイナーな問題があると仮定していますが、マイナーな問題がある場合は、それらが何であるか、つまりその違いを知りたいと思います。 – Spencer

答えて

10

最も明白なアプローチはもちろんです:

それは比較を行うにはPythonの内部に依存するため、可能な限り最速であるべき
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()) 
関連する問題