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

156 投票
7 回答
228742 浏览
提问于 2025-04-15 20:50

我想找一种方法,把一个列表里的所有值从另一个列表中删除。

就像这样:

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

7 个回答

49

如果你的数据里没有重复的值,可以使用集合差集的方法。

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

然后,如果需要的话,可以再把结果转换回列表。

90

我在寻找一种快速的方法来处理这个问题,所以我尝试了一些推荐的方式。结果让我很惊讶,所以我想和大家分享一下。

实验是用 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

所以你可以看到,使用集合的方法比其他方法快得多。是的,它不保留相似的项目,但如果你不需要这个功能,那就很适合你。而且列表推导和使用过滤函数之间几乎没有区别。使用'remove'方法大约快50倍,但它会修改原始列表。最好的选择是使用集合 - 它比列表推导快超过1000倍!

167

在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后在程序中使用这些数据。这个过程就像是从冰箱里拿食材,然后用这些食材做饭一样。

有些时候,我们会遇到一些错误或者问题,这就像在做饭时发现缺少某种调料。我们需要找到解决办法,确保我们的程序能够顺利运行。

在这个过程中,了解一些基本的概念和工具是非常重要的。就像学会使用刀具、锅具一样,掌握编程的基本知识可以帮助我们更好地完成任务。

总之,编程就像做饭,需要耐心和实践,随着时间的推移,我们会越来越熟练。

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

撰写回答