Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
保留重复项的两个列表的Python交集_Python_Duplicates_Array Intersect - Fatal编程技术网

保留重复项的两个列表的Python交集

保留重复项的两个列表的Python交集,python,duplicates,array-intersect,Python,Duplicates,Array Intersect,我有两个平面列表,其中一个包含重复的值。 比如说, 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]
它保持
数组1中元素的顺序和重复


它将
array2
转换为一个集合,以便更快地查找。注意,只有当
array2
足够大时,这才是有益的;如果
array2
很小,将其作为列表保存可能会更有效。

根据@Alex的回答,如果您还想提取每个令牌的索引,那么以下是方法:

found = [[index,i] for index,i in enumerate(array1) if i in array2]

你无法避免循环。。如果您使用库函数。。他们实际上在设计中使用循环我的意思是,我想知道是否有一种有效的方法来实现这一点,因为我将使用具有时间限制的超大规模阵列。@user32147:为什么不指定阵列的大小(比“超过数百万个值”更精确)时间限制呢?@user32147这很有效:你不会比O(n)快。但不管怎样,请看我的编辑,我对答案做了一点小小的改进。你可以使用
set(array2)
@PadraicCunningham在答案中已经提到了这一点,但我会把这一点说得更清楚一点。