【问题标题】:Intersection of two lists, keeping duplicates in the first list两个列表的交集,在第一个列表中保留重复项
【发布时间】:2014-12-27 02:33:20
【问题描述】:

我有两个平面列表,其中一个包含重复值。 例如,

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]

我想避免循环,因为实际数组将包含数百万个值。 我尝试了各种集合和相交组合,但就是无法保留重复项..

【问题讨论】:

  • 你无法避免循环......如果你使用库函数......他们实际上在他们的设计中使用循环

标签: python duplicates array-intersect


【解决方案1】:

你不想使用循环是什么意思?您将不得不以一种或另一种方式对其进行迭代。只需单独取出每件物品,然后检查它是否在 array2 中:

items = set(array2)
found = [i for i in array1 if i in items]

此外,根据您将如何使用结果,考虑使用生成器:

found = (i for i in array1 if i in array2)

这样您就不必一次将整个内容全部记住。

【讨论】:

  • 我的意思是我想知道是否有一种有效的方法来做到这一点,因为我将使用具有时间限制的非常大的数组..
  • @user32147:你为什么不指定数组的大小(比“超过数百万个值”更精确)和时间限制?
  • @user32147 这非常有效:你不会比 O(n) 更快。但无论如何请看我的编辑,我对答案做了一点小小的改进。
  • 你可以使用set(array2)
  • @PadraicCunningham 已经在答案中提到了这一点,但我会更好地说明这一点。
【解决方案2】:

下面会做:

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 很小,将其保留为列表可能会更高效。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      相关资源
      最近更新 更多