获取两个数组的相同部分

时间:2014-07-25 13:37:33

标签: python algorithm list

有两个大型数组a和b。如何优雅地获得相同的部分?

a = [1, 4, 5, 9, 100000, ...]
b = [2, 5, 8, 9, 100001, ...]

len(a) > 100000000
len(b) > 100000000

如何使值看起来像这样:

[1 in b, 4 in b, 5 in b, 9 in b, 100000 in b, ... in b]
[False, False, True, True, False, ...]

非常感谢!

3 个答案:

答案 0 :(得分:3)

使用set

>>> a = [1, 4, 5, 9, 100000]
>>> b = [2, 5, 8, 9, 100001]
>>> b_set = set(b)
>>> [x in b for x in a]
[False, False, True, True, False]
如果您使用x in sequence代替set

list操作会快得多。

请参阅TimeComplexity - Python Wiki

答案 1 :(得分:2)

如果数组已排序(您的示例表明它们是),则可以使用线性时间和常量内存有效地完成,使用两个指针并逐渐增加指向最小元素的指针。

类似Python的伪代码:

i = 0
j = 0
res = []
while i < len(a) and j < len(b):
   if a[i] == b[j]:
      res.append(True)
      i = i+1
      j = j+1
      continue
   if a[i] < b[j]:
      i = i + 1
      res.append(False)
   else:
      j = j + 1
while i < len(a):
    i = i + 1
    res.append(False)

PS注意到&#39; res&#39;用于输出的数组可以替换为就地覆盖a,因为只有在使用了元素(在a中)之后才编写,并且永远不会再需要它。

答案 2 :(得分:0)

如果你想要每个数组的相同部分,你可以简单地做:set(a).intersection(set(b))