Pythonic方法查找未包含在另一个python列表中的python列表的元素

时间:2015-02-01 19:56:02

标签: python

我正在努力寻找更快的解决方案。我的问题包括创建一个从其他2个列表派生的python列表。 List_a有很多元素,list_b有更多元素,有些与list_a有共同之处。

这就是我所拥有的:

list_a = [a huge python list with over 100,000 elements ]
list_b = [a huge python list with over 1,000,00 elements]

我的解决方案:

list_c = []
for item in list_a:
    if item not in list_b:
        list_c.append(item)

它有效,但它非常非常慢。有没有办法更快地解决这个问题?

4 个答案:

答案 0 :(得分:5)

您可以使用列表理解

list_c = [item for item in list_a if item not in list_b]

但是就性能而言,请注意in set操作比list更快,因此您可能需要再添加一个步骤

set_b = set(list_b)
list_c = [item for item in list_a if item not in set_b]

答案 1 :(得分:2)

像这样使用set

a = set(['a', 'b', 'c', 1, 2, 3])
b = set(['a', 'b', 'c'])

print list(a.difference(b)) # prints [1, 2, 3]

答案 2 :(得分:2)

您可以为此目的使用集合:https://docs.python.org/2/library/sets.html

result = (set(a) - (set(a) & set(b))

此处set(a) & set(b)为您提供了两个集/列表的并集,set(a) - (set(a)&set(b))将为您提供不在b中的所有元素

答案 3 :(得分:1)

一种解决方案是将list_a和list_b矢量化为numpy数组,使用数组,然后将生成的数组转换回列表。这将大大提高list_c的生成速度。试试这个:

a = np.array(list_a)
b = np.array(list_b)
list_c = np.setdiff1d(b, a).tolist()