Python列表的差异

7
我正在尝试查找列表A中存在但不在列表B中的所有元素。
我认为可以使用类似于newList = list(set(a) & !set(b))或者newList = list(set(a) & (not set(b)))的方法,但这样并不可行。
除了这种方法,是否有更好的方法来实现我想做的事情呢?
newList = []
for item in a:
    if item not in b:
        newList.append(item)

同样重要的是,这需要在Python 2.6中完成。

4个回答

18
你正在寻找"集合差异(set difference)"功能:

你需要使用集合差异功能:

newList = list(set(a).difference(b))

另外,可以使用减号操作符:

list(set(a) - set(b))

1
请注意,从列表 -> 集合 -> 列表的转换将丢失原始列表的顺序。 - sirdodger

10

你试过了吗

list(set(a) - set(b))

这里是所有Python集合操作的列表。

然而,这会不必要地为b创建一个新的集合。正如@phihag所提到的,使用difference方法可以避免这种情况。


这会不必要地构建一个集合b,而你从未查找过它。 - phihag
你说得对。我没有意识到difference方法接受任何可迭代对象,而不仅仅是集合。已编辑答案。 - Praveen Gollakota

1
>>> list1 = [1,2,3,4,5]
>>> list2 = [4,5,6,7,8]
>>> print list(set(list1)-set(list2))
[1, 2, 3]

1
虽然这段代码可能是正确的,但请提供一些解释。 - Sascha Wolf
它对已经拥挤的领域有什么贡献?:\ - jtlz2

1
如果您关心维护顺序:

def list_difference(a, b):
    # returns new list of items in a that are not in b
    b = set(b)
    return [x for x in a if x not in b]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接