在Python中获取两个列表的差异

15 投票
10 回答
18032 浏览
提问于 2025-04-16 13:41

我有两个列表,l1l2。我想要从 l1 中找出那些不在 l2 里的项目。

l1 = [2, 3, 4, 5]
l2 = [0, 1, 2, 3]

我只想得到 [4,5] - 也就是 l1 中的新值。

[i for i in l1 if not i in l2 ]

我能不通过循环来实现这个吗?

10 个回答

3

如果你不在乎元素的顺序,可以使用集合(sets):

l1 = set([2, 3, 4, 5])
l2 = set([0, 1, 2, 3])
print l1 - l2

打印输出

set([4, 5])
13

你不能不使用循环来完成这个任务。即使你只调用一个方法,内部也会进行循环。

你现在的方法对于小列表来说没问题,但对于更大的列表,你可以考虑使用另一种方法:

s2 = set(l2)
result = [i for i in l1 if not i in s2 ]

这样做会更快,而且还能保持l1中元素的原始顺序。

18

简单来说,答案是肯定的:list(set(l1) - set(l2)),不过这样做不会保留原来的顺序。

详细来说,答案是否定的,因为计算机内部总是会进行迭代。不过如果你使用set(),这个迭代过程会被高度优化,速度会比你用列表推导式快很多(更不用说用集合检查某个值是否在里面,value in list的速度比在列表中要快多了)。

撰写回答