如何基于python中另一个列表中的元素过滤列表

时间:2019-03-14 20:03:30

标签: python list filter

我有一个大约62,000个数字的列表A,另一个大约370,000个列表B。我想过滤B,使其只包含来自A的元素。我尝试过这样的事情:

A=[0,3,5,73,88,43,2,1]
B=[0,5,10,42,43,56,83,88,892,1089,3165]
C=[item for item in A if item in set(B)] 

这是可行的,但是对于这么大的列表显然很慢,因为(我认为?)即使在B中已经找到该元素,搜索仍会遍历整个B。因此脚本正在遍历370,000个列表元素62,000次。

A和B中的元素是唯一的(B包含0到700,000之间的唯一值的列表,而A包含这些值的唯一子集),因此一旦在B中找到A [i],搜索就可以停止。值也按升序排列(如果有任何含义)。

有什么方法可以更快地做到这一点?

2 个答案:

答案 0 :(得分:7)

这将为A中的每个项目创建一个新的set(B)。而应使用内置的set.intersection

C = set(A).intersection(B)

答案 1 :(得分:0)

要真正确定我所做的是最快的,我会这样做的:

A=[0,3,5,73,88,43,2,1]
B=[0,5,10,42,43,56,83,88,892,1089,3165]

B_filter = B.copy()
C = []
for item in A:
    if filter in B_filter:
        C.append(item)
        B_filter.pop(0) # B_filter is a list, and it's in ascending order so always the first

如果您不担心丢失B列表,可以只使用B而不是B_filter而不声明B_filter,这样就不必复制一个370k的大型列表。