找到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