我想取列表x和y的差值:
>>> x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> y = [1, 3, 5, 7, 9]
>>> x - y
# should return [0, 2, 4, 6, 8]
我想取列表x和y的差值:
>>> x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> y = [1, 3, 5, 7, 9]
>>> x - y
# should return [0, 2, 4, 6, 8]
当前回答
from collections import Counter
y = Counter(y)
x = Counter(x)
print(list(x-y))
其他回答
list1 = ['a', 'c', 'a', 'b', 'k']
list2 = ['a', 'a', 'a', 'a', 'b', 'c', 'c', 'd', 'e', 'f']
for e in list1:
try:
list2.remove(e)
except ValueError:
print(f'{e} not in list')
list2
# ['a', 'a', 'c', 'd', 'e', 'f']
这将改变list2。如果你想保护list2,只需复制它,并在这段代码中使用list2的副本。
如果列表允许重复元素,你可以使用Counter from collections:
from collections import Counter
result = list((Counter(x)-Counter(y)).elements())
如果你需要保留x中元素的顺序:
result = [ v for c in [Counter(y)] for v in x if not c[v] or c.subtract([v]) ]
@aaronasterling提供的答案看起来不错,但是,它与列表的默认接口不兼容:x = MyList(1,2,3,4) vs x = MyList([1,2,3,4])。因此,下面的代码可以用作更友好的python列表:
class MyList(list):
def __init__(self, *args):
super(MyList, self).__init__(*args)
def __sub__(self, other):
return self.__class__([item for item in self if item not in other])
例子:
x = MyList([1, 2, 3, 4])
y = MyList([2, 5, 2])
z = x - y
这个例子减去了两个列表:
# List of pairs of points
list = []
list.append([(602, 336), (624, 365)])
list.append([(635, 336), (654, 365)])
list.append([(642, 342), (648, 358)])
list.append([(644, 344), (646, 356)])
list.append([(653, 337), (671, 365)])
list.append([(728, 13), (739, 32)])
list.append([(756, 59), (767, 79)])
itens_to_remove = []
itens_to_remove.append([(642, 342), (648, 358)])
itens_to_remove.append([(644, 344), (646, 356)])
print("Initial List Size: ", len(list))
for a in itens_to_remove:
for b in list:
if a == b :
list.remove(b)
print("Final List Size: ", len(list))
Let:
>>> xs = [1, 2, 3, 4, 3, 2, 1]
>>> ys = [1, 3, 3]
每一项只保留一次xs - ys == {2,4}
取集合差值:
>>> set(xs) - set(ys)
{2, 4}
删除所有xs - ys == [2,4,2]
>>> [x for x in xs if x not in ys]
[2, 4, 2]
如果ys很大,为了获得更好的性能,只将1个ys转换为一个set:
>>> ys_set = set(ys)
>>> [x for x in xs if x not in ys_set]
[2, 4, 2]
只删除相同数量的出现xs - ys == [2,4,2,1]
from collections import Counter, defaultdict
def diff(xs, ys):
counter = Counter(ys)
for x in xs:
if counter[x] > 0:
counter[x] -= 1
continue
yield x
>>> list(diff(xs, ys))
[2, 4, 2, 1]
1 .将xs转换为set并获取set的差异是不必要的(并且更慢,并且破坏顺序),因为我们只需要在xs上迭代一次。