有两个大型数组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, ...]
非常感谢!
答案 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
操作会快得多。
答案 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))