Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在两个列表中查找重叠对象的最快方法_Python_List_Match_Unique - Fatal编程技术网

Python 在两个列表中查找重叠对象的最快方法

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

我有两个自定义对象列表,分别是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(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)