两个柜台的交叉点

时间:2017-05-16 22:15:30

标签: python counter intersection

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

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

但也许有更容易(或更快)的方式?

2 个答案:

答案 0 :(得分:9)

使用&进行交叉:

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

From docs

  

交叉点(&)和联合(|)会返回相应计数的最小最大

答案 1 :(得分: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])

使用

cnts_a_b = cnts_a & cnts_b

因为&表示Counter个对象的交集