我正在努力寻找更快的解决方案。我的问题包括创建一个从其他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)
它有效,但它非常非常慢。有没有办法更快地解决这个问题?
答案 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()