[英]Removing common elements in two lists
我有两个正整数的排序列表,可以有重复的元素,我必须删除匹配的数字对,每个列表一个:
a=[1,2,2,2,3]
b=[2,3,4,5,5]
应成为:
a=[1,2,2]
b=[4,5,5]
也就是说,2和3已被删除,因为它们出现在两个列表中。
由于重复的元素,此处不能使用集合交集。
我该怎么做?
要删除两个列表中出现的元素,请使用以下命令:
for i in a[:]:
if i in b:
a.remove(i)
b.remove(i)
要创建一个为您完成的功能,只需执行以下操作:
def removeCommonElements(a, b):
for e in a[:]:
if e in b:
a.remove(e)
b.remove(e)
或者返回新列表而不是编辑旧列表:
def getWithoutCommonElements(a, b): # Name subject to change
a2 = a.copy()
b2 = b.copy()
for e in a:
if e not in b:
a2.remove(e)
b2.remove(e)
return a2, b2
但是前者可以替换为removeCommonElements
如下所示:
a2, b2 = a.copy(), b.copy()
removeCommonElements(a2, b2)
哪个会保留a和b,但是创建没有共同元素的重复项。
集合中的Counter对象可以非常简洁地完成:
from collections import Counter
a=Counter([1,2,2,2,3])
b=Counter([2,3,4,5,5])
print list((a-b).elements())
print list((b-a).elements())
这个想法是:
(警告:输出列表不一定要排序)
鉴于列表已排序,您可以合并/分发元素,例如:
x, y = [], []
while a and b:
if a[0] < b[0]:
x.append(a.pop(0))
elif a[0] > b[0]:
y.append(b.pop(0))
else: # a[0]==b[0]
a.pop(0)
b.pop(0)
x += a
y += b
@Mahi给出的解决方案几乎是正确的。 实现您想要的最简单方法是:
def remove_common_elements(a, b):
for i in a[:]:
if i in b:
a.remove(i)
b.remove(i)
return a, b
这里重要的是通过写a[:]
来复制a
。 如果在从列表中删除元素的同时迭代列表,则无法获得正确的结果。
如果您不想修改列表,请事先复制两个列表并返回复制的列表。
def remove_common_elements(a, b):
a_new = a[:]
b_new = b[:]
for i in a:
if i in b_new:
a_new.remove(i)
b_new.remove(i)
return a_new, b_new
一种解决方案是创建a的新副本并从b中删除公共元素。
a = [1,2,2,2,3]
b = [2,2,3,4,5]
a_new = []
for ai in a:
if ai in b:
b.remove(ai)
else:
a_new.append(ai)
print a_new
print b
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.