两个列表的交集,保留第一个列表中的重复项
我有两个简单的列表,其中一个列表里有重复的值。
array1 = [1,4,4,7,10,10,10,15,16,17,18,20]
array2 = [4,6,7,8,9,10]
我需要找出在第一个列表(array1)中也出现在第二个列表(array2)里的值,并且要保留第一个列表中的重复值。
我想要的结果是
result = [4,4,7,10,10,10]
我想避免使用循环,因为实际的列表会有上百万个值。我尝试过各种集合和交集的组合,但就是无法保留重复的值……
3 个回答
0
接着@Alex的回答,如果你还想提取每个词的索引(位置),那可以这样做:
found = [[index,i] for index,i in enumerate(array1) if i in array2]
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
很小,保持它作为列表可能会更有效率。
8
你说你不想用循环,这是什么意思呢?不管怎样,你都得一个一个地处理这些东西。你可以逐个拿出每个项目,然后检查它是否在 array2
里面:
items = set(array2)
found = [i for i in array1 if i in items]
另外,根据你打算如何使用结果,可以考虑使用生成器:
found = (i for i in array1 if i in array2)
这样你就不需要一次性把所有东西都放在内存里。