两个列表的Python交集保持重复

use*_*147 7 python duplicates array-intersect

我有两个平面列表,其中一个包含重复值.例如,

array1 = [1,4,4,7,10,10,10,15,16,17,18,20]
array2 = [4,6,7,8,9,10]
Run Code Online (Sandbox Code Playgroud)

我需要在array1中找到也在array2中的值,在array1中保留重复数据.期望的结果将是

result = [4,4,7,10,10,10]
Run Code Online (Sandbox Code Playgroud)

我想避免循环,因为实际数组将包含数百万的值.我尝试了各种设置和交叉组合,但是无法保留重复项.

任何帮助将不胜感激!

Ale*_*ton 5

你是什​​么意思,你不想使用循环?你将不得不以这种或那种方式迭代它.只需单独接收每个项目,然后检查它是否在array2您的位置:

items = set(array2)
found = [i for i in array1 if i in items]
Run Code Online (Sandbox Code Playgroud)

此外,根据您将如何使用结果,请考虑使用生成器:

found = (i for i in array1 if i in array2)
Run Code Online (Sandbox Code Playgroud)

这样你就不必一次把所有东西都记在内存中.


NPE*_*NPE 5

以下将做到这一点:

array1 = [1,4,4,7,10,10,10,15,16,17,18,20]
array2 = [4,6,7,8,9,10]
set2 = set(array2)
print [el for el in array1 if el in set2]
Run Code Online (Sandbox Code Playgroud)

它保持元素的顺序和重复array1

它变成array2了一个更快的查找集合。请注意,这仅在array2足够大时才有用;如果array2很小,将其保留为列表可能会更高效。