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

use*_*477 14 python list

给出2个列表:

a = [3,4,5,5,5,6]
b = [1,3,4,4,5,5,6,7]
Run Code Online (Sandbox Code Playgroud)

我想找到"重叠":

c = [3,4,5,5,6]
Run Code Online (Sandbox Code Playgroud)

我也喜欢它,如果我可以提取"剩余"部分a和b不在c中.

a_remainder = [5,]
b_remainder = [1,4,7,]
Run Code Online (Sandbox Code Playgroud)

注意:a中有三个5,b有两个.b里面有两个4,有一个.

结果列表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"
Run Code Online (Sandbox Code Playgroud)

另一方面,对于我要求的是什么比"重叠"和"剩余"更准确的名称?

Ros*_*ron 18

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
Run Code Online (Sandbox Code Playgroud)


dfb*_*dfb 6

在集合的语言中,重叠是"交集",余数是"集合差异".如果你有不同的项目,你不必自己做这些操作,如果你有兴趣,请查看http://docs.python.org/library/sets.html.

由于我们不使用不同的元素,因此您的方法是合理的.如果你想让它运行得更快,你可以为每个列表创建一个字典,并将数字映射到每个数组中的元素数量(例如,在a,3-> 1,4-> 1,5-> 2等中).然后,您将遍历映射a,确定该字母是否存在,减少其计数并将其添加到新列表中

未经测试的代码,但这是个主意

def add_or_update(map,value):
    if value in map:
        map[value]+=1
    else
        map[value]=1

b_dict = dict()
for b_elem in b:
    add_or_update(b_dict,b_elem)

intersect = []; diff = [];

for a_elem in a:
    if a_elem in b_dict and b_dict[a_elem]>0:
        intersect.add(a_elem);

for k,v in diff:
    for i in range(v):
        diff.add(k);
Run Code Online (Sandbox Code Playgroud)


kef*_*hou 5

使用python设置

intersection = set(a) & set(b)
a_remainder = set(a) - set(b)
b_remainder = set(b) - set(a)
Run Code Online (Sandbox Code Playgroud)

  • 这是一个好主意,但该人的数据不是有效的集合,并且有欺骗性,并且也考虑了这一点。 (2认同)