两个计数器的交集
Intersection of two Counters
我正在尝试查找两个列表之间的共享元素(以及共享的出现次数)。例如,这两个列表的交集:
a = [1, 1, 2, 3, 4, 5, 6, 7, 8, 1]
b = [1, 1, 3, 5, 7, 9]
应该 return 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])
但也许有更简单(或更快)的方法?
交集使用&
:
>>> Counter(a) & Counter(b)
Counter({1: 2, 3: 1, 5: 1, 7: 1})
Intersection(&
) and union(|
) return the minimum and maximum of corresponding counts.
而不是
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
as &
表示 Counter
个对象的 交叉点 。
我正在尝试查找两个列表之间的共享元素(以及共享的出现次数)。例如,这两个列表的交集:
a = [1, 1, 2, 3, 4, 5, 6, 7, 8, 1]
b = [1, 1, 3, 5, 7, 9]
应该 return 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])
但也许有更简单(或更快)的方法?
交集使用&
:
>>> Counter(a) & Counter(b)
Counter({1: 2, 3: 1, 5: 1, 7: 1})
Intersection(
&
) and union(|
) return the minimum and maximum of corresponding counts.
而不是
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
as &
表示 Counter
个对象的 交叉点 。