2017-05-16 18 views
4

私は、2つのリスト間で共有要素(および出現の共有数)を見つけようとしています。たとえば、次の2つのリストの交差点:2つのカウンタの交点

a = [1, 1, 2, 3, 4, 5, 6, 7, 8, 1] 
b = [1, 1, 3, 5, 7, 9] 

は、例えば、Counter({1: 2, 3: 1, 5: 1, 7: 1})または類似した何かを返す必要があります{1: 2, 3: 1, 5: 1, 7: 1}または[1, 1, 3, 5, 7](リストの順序は関係ありません)。

私はすでに作品のアプローチがあります。

cnts_a = Counter(a) 
cnts_b = Counter(b) 
cnts_a_b = Counter() # counter for the shared values 
for key in set(cnts_a).intersection(cnts_b): 
    cnts_a_b[key] = min(cnts_a[key], cnts_b[key]) 

をしかし、おそらくより簡単に(またはより高速な)方法はありますか?

答えて

5

交差点に使用&

>>> Counter(a) & Counter(b) 
Counter({1: 2, 3: 1, 5: 1, 7: 1}) 

From docs

交差点(&)と労働組合(|)は、対応するカウントの最小最大返します。 &として

0

代わりの

cnts_a_b = Counter() # counter for the shared values 
for key in set(cnts_a).intersection(cnts_b): 
    cnts_a_b[key] = min(cnts_a[k], cnts_b[k]) 

使用

cnts_a_b = cnts_a & cnts_b 

Counterオブジェクトの交差点を意味します。

関連する問題