两个列表的交集,保留第一个列表中的重复项

11 投票
3 回答
8468 浏览
提问于 2025-04-30 17:48

我有两个简单的列表,其中一个列表里有重复的值。

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)

这样你就不需要一次性把所有东西都放在内存里。

撰写回答