10

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

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]

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

4

3 回答 3

7

你是什​​么意思你不想使用循环?您将不得不以一种或另一种方式对其进行迭代。只需单独取出每个物品并检查它是否在array2你去的时候:

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

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

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

这样您就不必一次将整个事情都记住了。

于 2014-10-30T21:12:35.140 回答
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]

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

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

于 2014-10-30T21:13:20.337 回答
0

继@Alex的回答之后,如果您还想提取每个标记的索引,那么方法如下:

found = [[index,i] for index,i in enumerate(array1) if i in array2]
于 2019-08-15T12:59:43.293 回答