在Python中获取两个列表的差异
我有两个列表,l1
和 l2
。我想要从 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
的速度比在列表中要快多了)。