我想取列表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的原始顺序:

[item for item in x if item not in y]

如果你不需要列表属性(例如,排序),使用一个集差异,正如其他答案所建议的:

list(set(x) - set(y))

为了允许x - y中缀语法,在从list继承的类上重写__sub__:

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   

其他回答

我们也可以使用set方法来查找两个列表之间的差异

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
y = [1, 3, 5, 7, 9]
list(set(x).difference(y))
[0, 2, 4, 6, 8]

在set中查找值比在list中查找值更快:

[item for item in x if item not in set(y)]

我相信这将会比:

[item for item in x if item not in 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]) ]
from collections import Counter

y = Counter(y)
x = Counter(x)

print(list(x-y))