2017-12-01 5 views
4

dict1のキーがdict2に何回存在するかチェックするにはどうすればよいですか? dict1のキーがdict2の変数valに存在し、初期値が4の場合は、キーが何回検出されたかに基づいて減算する必要があります。例えばdict1についてpythonの辞書間でキーが何回繰り返されるかを調べる

この

print dict1 
{(2, 0): 3, (3, 1): 0, (1, 1): 2, (2, 2): 1} 

dict2ように見えるdictsの間に2つのリピートキーがあるので、この

print `dict2` 
{(2, 0): 323, (3, 1): 32, (10, 10): 21, (20, 2): 100} 

のように見える、val2に等しくなければなりません。

dict2dict1と同じに見える場合、val0である必要があります。

また、dict1は常に同じサイズですが、dict2は非常に大きくなる可能性があるため、高速な検索方法が理想的です。最後に、ここのディクテーションの値は実際には何の意味もありません。セット交差点を使用して

+1

'lenは([dict2でdict1におけるkのk個のkの場合])' – alfasin

+0

ちょうどその取得するためにリストを作成する理由@alfasin長さ? 'sum(dict2のkならばdict1のkに対して1)'がより効率的です。しかし、この作業のために、交点がより速くなります。 –

+0

@ PM2Ring ha、良い点:) – alfasin

答えて

4

d1 = {(2, 0): 3, (3, 1): 0, (1, 1): 2, (2, 2): 1} 
d2 = {(2, 0): 323, (3, 1): 32, (10, 10): 21, (20, 2): 100} 

sd1 = set(d1.keys()) 
sd2 = set(d2.keys()) 
len(sd1.intersection(sd2)) 

編集: キービューがすでに同じような設定されているので、あなたが直接d1.keys() & d2.keys()を行うことができますので。 .keys()は、既存のdict構造(コメントの@ PM2RINGに対するクレジット)への代替インタフェースを提供するだけなので、非常に安い呼び出しです。

+1

キービューは既に設定されているので、 'd1.keys()&d2.keys()'を実行することができます –

+1

'.keys()'は非常に安い呼び出しです。既存のdict構造体への代替インタフェースを提供するだけです。 –

0

各ディクテーション内のキーのリストからセットを作成します。 これらの集合の交点と和集合を求めます。 union - intersectionは、あなたに違いのセットを提供します。 これが0の場合、0が返されます。 それ以外の場合は、交差点のサイズを返します。

4

dict_keysがalready set-likeなので、あなたは、単にPythonの2ではPythonの3のためにある

len(dict1.keys() & dict2.keys()) 

を使用することができ、同等のビューオブジェクトを使用すると、同様に使用したいdict.viewkeys()、です。

len(dict1.viewkeys() & dict2.viewkeys()) 
0

これは、Python 2と3で動作します:len(set(dict1).intersection(dict2))

In [1]: dict1 = {(2, 0): 3, (3, 1): 0, (1, 1): 2, (2, 2): 1} 

In [2]: dict2 = {(2, 0): 323, (3, 1): 32, (10, 10): 21, (20, 2): 100} 

In [3]: len(set(dict1).intersection(dict2)) 
Out[3]: 2 
関連する問題