2011-12-27 6 views
1

ユニークなキーを持つ2つの大きな辞書がありますが、値が重複する可能性があります。私は辞書の値の各セットをお互いに比較し、重複の数を見つけたいと思います。私は2つのforループとsetを使用してこれを行っていますが、これを行うためにはより高速でエレガントな方法があるのだろうかと思っています。セットを使用するよりも早く辞書を比較する方法

dic1 = {'a': ['1','2','3'], 'b':['4','5','6'], 'c':['7','8','9']} 
dic2 = {'d': ['1','8','9'], 'e':['10','11','12'], 'f':['7','8','9']} 

final_list=[] 
for key1 in dic1: 
    temp=[]  
    for key2 in dic2: 
     test = set(dic1[key1]) 
     query = set(dic2[key2]) 
     x = len(test & query) 
     temp.append([key2, x]) 
    final_list.append([key1, temp]) 
+0

最後の行にエラーがあります。あなたは 'final_list.append([key1、temp])'を意味しましたか? –

+0

良いキャッチ。 – zach

+0

dic1のすべてのキーとdic2のすべてのキーを実際に比較していますか?それは彼らが** O ** n^2と呼ぶものです。それは本質的に遅いです。 –

答えて

2

辞書の1つ(または両方)を「反転」したいとします。

val1 = defaultdict(list) 
for k in dic1: 
    for v in dic1[k]: 
     val[v].append(k) 
# val1 is a dictionary with each value mapped to the list of keys that contain that value. 

for k in dic2: 
    for v in dic2[k]: 
     val1[v] is the list of all keys in dic1 that have this value 
+0

私はこの考えが好きです。私は2つの辞書のサイズが違うのでうまくいくと思う。小さなものを「反転」して大きなものをループすることができます。 – zach

+1

@zach:正確に後方に。大きなものを逆にする。小さいものをループする。それはより速くなります。 –