找到2个python列表之间的“重叠”


问题内容

给出2个列表:

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

我想找到“重叠”:

c = [3,4,5,5,6]

如果我可以提取a和b中不在c中的部分“余数”,我也很喜欢。

a_remainder = [5,]
b_remainder = [1,4,7,]

注意:a中有三个5,b中有两个。b有两个4,而a有一个。

结果列表c应该有两个5(由列表b限制)和一个4(由列表a限制)。

这给了我我想要的东西,但是我不禁认为还有更好的方法。

import copy

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

c = []
for elem in copy.deepcopy(a):
    if elem in b:
        a.pop(a.index(elem))
        c.append(b.pop(b.index(elem)))

# now a and b both contain the "remainders" and c contains the "overlap"

另一方面,我要的名称比“重叠”和“余数”更准确的名称是什么?


问题答案:

collection.Counter 可以使用Python 2.7中提供的功能来实现完全按照您想要的方式进行的多集。

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

a_multiset = collections.Counter(a)
b_multiset = collections.Counter(b)

overlap = list((a_multiset & b_multiset).elements())
a_remainder = list((a_multiset - b_multiset).elements())
b_remainder = list((b_multiset - a_multiset).elements())

print overlap, a_remainder, b_remainder