Python 在两个列表中查找重叠对象的最快方法
我有两个自定义对象列表,分别是9904和7223大小的Python 在两个列表中查找重叠对象的最快方法,python,list,match,unique,Python,List,Match,Unique,我有两个自定义对象列表,分别是9904和7223大小的train和test。 每个列表中的元素都是唯一的 我想找到两个列表中存在的元素。目前我正在使用以下方法,但速度非常缓慢: overlap = [e for e in test if e in train] 有没有更快的方法来实现这一点?要完成@Jeff的回答,我们可以比较两种方法的计算时间: set_test = set(e) set_train = set(train) overlap = set_test.intersection
train
和test
。
每个列表中的元素都是唯一的
我想找到两个列表中存在的元素。目前我正在使用以下方法,但速度非常缓慢:
overlap = [e for e in test if e in train]
有没有更快的方法来实现这一点?要完成@Jeff的回答,我们可以比较两种方法的计算时间:
set_test = set(e)
set_train = set(train)
overlap = set_test.intersection(set_train)
import numpy as np
import time
test = np.random.randint(1,50000,10000)
train = np.random.randint(1,50000,10000)
start_list = time.time()
overlap = [e for e in test if e in train]
end_list = time.time()
print("with list comprehension: " + str(end_list - start_list))
set_test = set(test)
set_train = set(train)
start_set = time.time()
overlap = set_test.intersection(set_train)
end_set = time.time()
print("with sets: " + str(end_set - start_set))
我们得到的结果是:
with list comprehension: 0.08894968032836914
with sets: 0.0003533363342285156
因此,使用集合的方法大约要快300倍。@yatu建议使用,因为这会使成员资格测试快得多-使用列表,解释器必须依次查看每个元素,而使用集合(或dict,尽管这与此无关)散列技术。您可以简单地将列表替换为它们的集合等价物(通过对列表应用set()
构造函数获得),您应该会看到一些加速
但是,有一些特定的方法可以确定两个集合的交集和并集。只要顺序不重要*,下面是您可以使用的方法:
train_set = set(train) # Use frozenset if no mutation is required
test_set = set(test)
common_elements = train_set & test_set # or, equivalently
common_elements = train_set.intersection(test_set)
*直到Python3.7,集合或字典中元素的顺序才得到保证。您可以使用
numpy的intersect1d()
:-
尝试使用。从列表中构造两个集合,并使用集合。交叉点method@yatu哇。那太快了,谢谢。这是一个真实且信息丰富的答案-我的答案太简短了。谢谢@dallonsi-这是正确的答案!太好了。谢谢
import random
import numpy as np
train = [random.randint(1,51) for var in range(1,9000)] #Your list
test = [random.randint(1,51) for var in range(1,9000)] #Your list
train = np.array(train) #Converting list into numpy's array
test = np.array(test)
overlap = np.intersect1d(train, test)
print(overlap)