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

时间:2014-10-30 21:11:12

标签: python duplicates array-intersect

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

array1 = [1,4,4,7,10,10,10,15,16,17,18,20]
array2 = [4,6,7,8,9,10]

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

result = [4,4,7,10,10,10]

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

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:5)

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

items = set(array2)
found = [i for i in array1 if i in items]

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

found = (i for i in array1 if i in array2)

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

答案 1 :(得分:3)

以下将会这样做:

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]

它保留了array1中元素的顺序和重复。

它将array2转换为一组以便更快地进行查找。请注意,只有array2足够大时才有用;如果array2很小,则将其保留为列表可能会更高效。

答案 2 :(得分:0)

根据@Alex的答案,如果您还想提取每个令牌的索引,则方法如下:

  Column1  Column2
0  Start1      633
1    End.      855
3  Start3      231
4    End.      545
6  Start5      243
7    End.      333