我有一个大约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],搜索就可以停止。值也按升序排列(如果有任何含义)。
有什么方法可以更快地做到这一点?
答案 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的大型列表。