我有两个列表,l1
和l2
。 我需要从l1
中获取不在l2
中的项目。
l1 = [2, 3, 4, 5]
l2 = [0, 1, 2, 3]
我想要获取[l1]中只有[4,5]这两个新值。
[i for i in l1 if not i in l2 ]
我可以不用迭代来实现吗?
我有两个列表,l1
和l2
。 我需要从l1
中获取不在l2
中的项目。
l1 = [2, 3, 4, 5]
l2 = [0, 1, 2, 3]
我想要获取[l1]中只有[4,5]这两个新值。
[i for i in l1 if not i in l2 ]
我可以不用迭代来实现吗?
简短回答是: list(set(l1) - set(l2))
,但这不会保留原有的顺序。
详细来说,不完全是,因为CPU内部总是要进行迭代。不过如果你使用set()
,迭代将会被高度优化,并且比列表推导式快得多(更不用说在集合中使用value in list
来检查成员资格比在列表中快得多)。
你不能不迭代地完成它。即使你调用单个方法,内部也会进行迭代。
你的方法对于小列表来说是可以的,但是对于大列表,你可以使用这种方法代替:
s2 = set(l2)
result = [i for i in l1 if not i in s2 ]
这将会很快,同时也会保留l1中元素的原始顺序。
l1 = set([2, 3, 4, 5])
l2 = set([0, 1, 2, 3])
print l1 - l2
打印
set([4, 5])
[l1.remove(m) for m in l1 if m in l2]
你可以使用 set_1.difference_update(set_2) 来进行原地差异操作:
>>sl1 = set([2, 3, 4, 5])
>>sl2 = set([0, 1, 2, 3])
>>sl1.difference_update(sl2)
>>sl1
set([4, 5])
list( set(l1) - set(l2) )
这应该可以解决问题。
将它们转换为集合并使用差异运算符:
l1=[2,3,4,5]
l2=[0,1,2,3]
answer = set(l1) - set(l2)
使用内置模块set
>>> a = set([1,2,3,4,5])
>>> b = set([1,3,5])
>>> a.difference(b)
set([2, 4])
另一种方法
>>> a = set([1,2,3,4,5])
>>> b = [1,3,5]
>>> a.difference(b)
set([2, 4])
就像编程一样,一个简单的任务可以用多种方式完成。 我们可以使用列表推导式这样的方法来解决完全相同的问题。
fruits = ["apple", "banana", "cherry", "kiwi", "mango"]
ddd = ["apple", "banana", "mango"]
newlist = [x for x in fruits if x not in ddd]
print(newlist)
例子:
>>a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
我们也可以通过连接来获得完整的差异:
>>list (set(a) -set(b)) + list (set(b) -set(a))
>>[89, 34, 21, 55, 4, 6, 7, 9, 10, 11, 12]