我正在寻找一种方法,以删除从另一个列表中的列表中的所有值。
就像这样:
a = range(1,10) a.remove([2,3,7]) print a a = [1,4,5,6,8,9]
>>> 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或理解中创建集合。如果您这样做了,那么它将在每次迭代中重新创建,这完全违背了使用集合的要求。
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更简单。
S.Mark
最简单的方法是
>>> a = range(1, 10) >>> for x in [2, 3, 7]: ... a.remove(x) ... >>> a [1, 4, 5, 6, 8, 9]
这里可能存在的一个问题是,每次调用 move ()时,所有项都会在列表中重新排列以填补空白。因此,如果 a增长非常大,这将是相当缓慢的结束。
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多倍!