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

2024-04-19 04:49:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大约62000个数字的列表a,还有一个大约370000个数字的列表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中找到了。因此脚本将遍历370000个元素的列表62000次。你知道吗

A和B中的元素是唯一的(B包含0到700000之间的唯一值列表,A包含这些值的唯一子集),因此一旦在B中找到A[i],搜索就可以停止。如果这意味着什么的话,这些值也是按升序排列的。你知道吗

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


Tags: 方法in脚本元素列表forif数字
2条回答

为了确保我所做的是最快的,我会这么做:

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的大列表。你知道吗

这是为a中的每个项创建一个新的set(B)。相反,请使用内置的set.intersection

C = set(A).intersection(B)

相关问题 更多 >