给出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)
在集合的语言中,重叠是"交集",余数是"集合差异".如果你有不同的项目,你不必自己做这些操作,如果你有兴趣,请查看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)
使用python设置
intersection = set(a) & set(b)
a_remainder = set(a) - set(b)
b_remainder = set(b) - set(a)
Run Code Online (Sandbox Code Playgroud)