我有两个平面列表,其中一个包含重复值。例如,
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]
我想避免循环,因为实际数组将包含数百万个值。我尝试了各种集合和相交组合,但就是无法保留重复项..
我有两个平面列表,其中一个包含重复值。例如,
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]
我想避免循环,因为实际数组将包含数百万个值。我尝试了各种集合和相交组合,但就是无法保留重复项..
你是什么意思你不想使用循环?您将不得不以一种或另一种方式对其进行迭代。只需单独取出每个物品并检查它是否在array2
你去的时候:
items = set(array2)
found = [i for i in array1 if i in items]
此外,根据您将如何使用结果,考虑使用生成器:
found = (i for i in array1 if i in array2)
这样您就不必一次将整个事情都记住了。
以下将做到这一点:
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
很小,将其保留为列表可能会更高效。
继@Alex的回答之后,如果您还想提取每个标记的索引,那么方法如下:
found = [[index,i] for index,i in enumerate(array1) if i in array2]