从另一个列表中删除一个列表中的所有值?

我正在寻找一种方法,以删除从另一个列表中的列表中的所有值。

就像这样:

a = range(1,10)
a.remove([2,3,7])
print a
a = [1,4,5,6,8,9]
224134 次浏览
>>> a = range(1, 10)
>>> [x for x in a if x not in [2, 3, 7]]
[1, 4, 5, 6, 8, 9]
a = range(1,10)
itemsToRemove = set([2, 3, 7])
b = filter(lambda x: x not in itemsToRemove, a)

或者

b = [x for x in a if x not in itemsToRemove]

不要在 lambda或理解中创建集合。如果您这样做了,那么它将在每次迭代中重新创建,这完全违背了使用集合的要求。

其他人建议如何在过滤后制作新列表。

newl = [x for x in l if x not in [2,3,7]]

或者

newl = filter(lambda x: x not in [2,3,7], l)

但从你的问题,它看起来你想就地修改,你可以做到这一点,这也将是 快多了,如果原来的名单是长和项目被删除较少

l = range(1,10)
for o in set([2,3,7,11]):
try:
l.remove(o)
except ValueError:
pass


print l

产出: [1,4,5,6,8,9]

我正在检查 ValueError 异常,所以即使项目不在原始列表中也可以工作。

另外,如果你不需要就地修改解决方案的 S.Mark更简单。

最简单的方法是

>>> a = range(1, 10)
>>> for x in [2, 3, 7]:
...  a.remove(x)
...
>>> a
[1, 4, 5, 6, 8, 9]

这里可能存在的一个问题是,每次调用 move ()时,所有项都会在列表中重新排列以填补空白。因此,如果 a增长非常大,这将是相当缓慢的结束。

这种方法建立了一个全新的列表,其优点是我们避免了第一种方法的所有重组

>>> removeset = set([2, 3, 7])
>>> a = [x for x in a if x not in removeset]

如果您想在适当的位置修改 a,只需要做一个小小的更改

>>> removeset = set([2, 3, 7])
>>> a[:] = [x for x in a if x not in removeset]
>>> a=range(1,10)
>>> for i in [2,3,7]: a.remove(i)
...
>>> a
[1, 4, 5, 6, 8, 9]


>>> a=range(1,10)
>>> b=map(a.remove,[2,3,7])
>>> a
[1, 4, 5, 6, 8, 9]

如果没有重复的值,可以使用集合差异。

x = set(range(10))
y = x - set([2, 3, 7])
# y = set([0, 1, 4, 5, 6, 8, 9])

然后转换回列表,如果需要的话。

我正在寻找快速的方法来做这个课题,所以我做了一些实验与建议的方法。我对结果感到惊讶,所以我想和你们分享。

实验使用 Python 基准工具和

a = range(1,50000) # Source list
b = range(1,15000) # Items to remove

结果:

 def comprehension(a, b):
return [x for x in a if x not in b]

5次尝试,平均时间12.8秒

def filter_function(a, b):
return filter(lambda x: x not in b, a)

5次尝试,平均时间12.6秒

def modification(a,b):
for x in b:
try:
a.remove(x)
except ValueError:
pass
return a

5次,平均时间0.27秒

def set_approach(a,b):
return list(set(a)-set(b))

尝试5次,平均时间 0.0057

另外,我还对最后两个函数进行了另一个输入大小较大的度量

a = range(1,500000)
b = range(1,100000)

结果是:

对于修改(删除方法)-平均时间为252秒 对于设置的方法-平均时间是 0.75

因此,您可以看到,使用集合的方法比其他方法更快。是的,它不保存类似的项目,但如果你不需要它-它是为你。 而且列表内涵和使用过滤器功能几乎没有什么区别。使用“移除”比原来快50倍,但是它修改了源列表。 最好的选择是使用集-它比列表内涵快1000多倍!