2016-05-21 5 views
2

私はいくつかの共有キーといくつかの異なるものを持つ2つの辞書を持っています。 (各辞書には、他のキーには存在しないいくつかのキーがあります)。あたかも共有鍵だけが存在するかのように、2つの辞書が等しいかどうかを比較する良い方法はありますか?言い換えれば共有キーの辞書のみを比較する

私は次のように計算するための最も簡単な方法をしたい:

commonkeys = set(dict1).intersection(dict2) 
simple1 = dict((k, v) for k,v in dict1.items() if k in commonkeys) 
simple2 = dict((k, v) for k,v in dict2.items() if k in commonkeys) 
return simple1 == simple2 

私はこれにそれを簡素化することができた:

commonkeys = set(dict1).intersection(dict2) 
return all(dict1[key] == dict2[key] for key in commonkeys) 

しかし、私はそのアプローチのために願っています共通鍵の事前計算を必要としない。 (実際には、私はペアごとに比較する辞書のリストが2つあります。各リストのすべての辞書は同じキーのセットを持っていますので、commonkeysのような計算が必要な場合は、一度だけ行う必要があります)

+1

あなたは 'すべてを返します(commonkeysでiに対してdict1 [i] == dict2 [i])'を使用できませんでしたか? – CodenameLambda

+0

ええ、私はちょうどそれを編集していました。でも、もっと良い方法があると思っています。 – alexis

+0

「私はこれを簡略化できました」?私は気にしませんが、他の人にこれをしないでください^^ – CodenameLambda

答えて

3

次はどうですか?

return all(dict2[key] == val for key, val in dict1.iteritems() if key in dict2) 

あるいは短い(それはおそらくさらにいくつかの比較を必要とするが):

return all(dict2.get(key, val) == val for key, val in dict1.iteritems()) 
+0

2番目のバージョンが 'dict1'にあるが' dict2'にはないキーになるとすぐに 'False'を返すでしょう。 – alexis

+1

それを試してみてください:) 'dict1'にあり、' dict2' ['dict2.get(key、val)']にあるキーについては(https://docs.python.org/2/library/stdtypes .html#dict.get)は 'dict2 [key]'を返します。 'dict1'にあり、' dict2'でないキーに対しては明らかにそれ自身と等しい 'val'を返します。 –

+0

ああ、私はそれを参照してください。卑劣なこと! – alexis

0

この

dict((k, dict1[k]) for k in dict1.keys() + dict2.keys() if dict1.get(k) == dict2.get(k)) 

O(M + N)の比較をしてみます。

真偽結果が必要な場合は、上記の結果を単純にチェックします。そうでない場合はtrueを返します

+0

私はこれを等価チェックとしてどのように使用することを提案しているのか分かりません。 – alexis

+0

dict1.get(k)== dict2.get(k))) 'の場合は、dict1.keys()+ dict2.keys()のkに対してdict( –

関連する問題