我正在寻找一种方法从另一个列表中删除列表中的所有值。
这样的事情:
a = range(1,10)
a.remove([2,3,7])
print a
a = [1,4,5,6,8,9]
答案 0 :(得分:115)
>>> a = range(1, 10)
>>> [x for x in a if x not in [2, 3, 7]]
[1, 4, 5, 6, 8, 9]
答案 1 :(得分:42)
如果您没有重复值,则可以使用设置差异。
x = set(range(10))
y = x - set([2, 3, 7])
# y = set([0, 1, 4, 5, 6, 8, 9])
然后根据需要转换回列表。
答案 2 :(得分:34)
我一直在寻找快速的方法来完成这个主题,所以我用建议的方法做了一些实验。我对结果感到惊讶,所以我想和你分享。
使用 pythonbenchmark 工具和
进行实验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倍!
答案 3 :(得分:23)
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
内或理解中创建集合。如果你这样做,它将在每次迭代时重新创建,完全无法使用集合。
答案 4 :(得分:7)
最简单的方法是
>>> a = range(1, 10)
>>> for x in [2, 3, 7]:
... a.remove(x)
...
>>> a
[1, 4, 5, 6, 8, 9]
这里可能存在的一个问题是,每次调用remove()时,所有项目都会在列表中随机移动以填充漏洞。因此,如果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]
答案 5 :(得分:6)
其他人建议在过滤后制作新名单的方法,例如。
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
的就地修改解决方案,那么就更简单了。
答案 6 :(得分:5)
>>> 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]