我有两个平面列表,其中一个包含重复值。 例如,
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]
我想避免循环,因为实际数组将包含数百万个值。 我尝试了各种设置和交叉组合,但是无法保留重复项。
任何帮助将不胜感激!
答案 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