Python 两个计数器的交点

Python 两个计数器的交点,python,counter,intersection,Python,Counter,Intersection,我试图在两个列表之间找到共享元素(以及共享的出现次数)。例如,这两个列表的交集: a = [1, 1, 2, 3, 4, 5, 6, 7, 8, 1] b = [1, 1, 3, 5, 7, 9] 应该返回计数器({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

我试图在两个列表之间找到共享元素(以及共享的出现次数)。例如,这两个列表的交集:

a = [1, 1, 2, 3, 4, 5, 6, 7, 8, 1]
b = [1, 1, 3, 5, 7, 9]
应该返回
计数器({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])

但也许有一种更简单(或更快)的方法?

使用
&
进行交叉:

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

交叉点(
&
)和并集(
|
)返回相应计数的最小值和最大值

而不是

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])
使用

as
&
表示
计数器
对象的交点

cnts_a_b = cnts_a & cnts_b