Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.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_Intersection_Python 2.7_Intersect - Fatal编程技术网

Python列表交叉点效率:生成器还是筛选器()?

Python列表交叉点效率:生成器还是筛选器()?,python,list,intersection,python-2.7,intersect,Python,List,Intersection,Python 2.7,Intersect,我想将Python(2.7)中的两个列表相交。我需要结果是可接受的: list1 = [1,2,3,4] list2 = [3,4,5,6] result = (3,4) # any kind of iterable 交叉点后的第一件事是提供完整的迭代,以下哪项更有效 使用发电机: result = (x for x in list1 if x in list2) 使用筛选器(): 其他建议 提前感谢, 阿姆农这两个都不是。最好的方法是使用集合 list1 = [1,2,3,4] list2

我想将Python(2.7)中的两个列表相交。我需要结果是可接受的:

list1 = [1,2,3,4]
list2 = [3,4,5,6]
result = (3,4) # any kind of iterable
交叉点后的第一件事是提供完整的迭代,以下哪项更有效

使用发电机:

result = (x for x in list1 if x in list2)
使用筛选器():

其他建议

提前感谢,

阿姆农

这两个都不是。最好的方法是使用集合

list1 = [1,2,3,4]
list2 = [3,4,5,6]
result = set(list1).intersection(list2)

集合是可编辑的,因此无需将结果转换为任何内容。

您的解决方案的复杂性为
O(m*n)
,其中
m
n
分别是两个列表的长度。您可以使用以下列表之一的集合将复杂性提高到
O(m+n)

s = set(list1)
result = [x for x in list2 if x in s]
在速度比可读性更重要的情况下(也就是说,几乎从来没有),您也可以使用

result = filter(set(a).__contains__, b)

这比我机器上的其他解决方案快约20%。

对于列表,最有效的方法是使用:

result = set(list1).intersection(list2)
如前所述,但对于numpy阵列,
intersection1d
函数更有效:

import numpy as np
result = np.intersection1d(list1, list2)
特别是,当您知道列表没有重复值时,可以将其用作:

result = np.intersection1d(list1, list2, assume_unique=True)

我试着比较列表交叉的3种方法的速度:

随机导入
a=[random.randint(0,1000)表示范围(1000)]
b=[random.randint(0,1000)表示范围(1000)]
解决方案1:列表理解 时间流逝:8.95265507698059

导入时间
开始=时间。时间()
对于范围(1000)内的:
结果=[x代表a中的x,如果x代表b]
消逝=时间。时间()-开始
打印(过去)
解决方案2:设置 时间流逝:0.09089064598083496

start=time.time()
对于范围(1000)内的:
结果=集合交叉点(集合(a),集合(b))
消逝=时间。时间()-开始
打印(过去)
解决方案3:numpy.1d 时间流逝:0.323300838470459

start=time.time()
对于范围(1000)内的:
结果=np.1d(a,b)
消逝=时间。时间()-开始
打印(过去)
结论
我认为使用
set.intersection
是最快的方法。

有趣的是,
set(list1)。intersection(list2)
set(list1)&set(list2)
快,我想这是因为创建两个集合比在我的机器上加载和调用
.intersection()
hmm..@mouad,
set(list1)&set)要昂贵(list2)
比使用
.intersection()
更快。但是差异不是很明显。这需要对列表进行排序吗?@Youda008列表不需要排序。集合是通过哈希实现的,因此无论在原始列表中的位置如何,查找都会在摊销的O(1)时间内进行。
result = np.intersection1d(list1, list2, assume_unique=True)