大多数Pythonic方式交叉引用两个列表

mae*_*ist 0 python arrays numpy list-comprehension pandas

问题:

我需要在long列表(~600,000个条目)和short列表(~300,000个条目)之间执行一些有点复杂的交叉引用任务.我试图找到这两个列表之间的类似条目,每个条目唯一由三个不同的整数(叫他们确定int1,int2int3).根据一个列表中的三个整数标识符,我想看看那些相同的三个整数是否在另一个列表中,并返回它们是哪些.

尝试:

首先,我将long列表中的每个三位整数元组压缩为一个名为的数组a.同样,我将short列表中的每个三元组元组压缩为一个名为的数组b:

a = [(int1,int2,int3),...] # 600,000 entries
b = [(int1,int2,int3),...] # 300,000 entries
Run Code Online (Sandbox Code Playgroud)

然后我遍历每个条目,a看看它是否在b.如果是,我将相应的元组附加到循环外的数组中c:

c= []
for i in range(0,len(a),1):
    if a[i] in b:
        c.append(a[i])
Run Code Online (Sandbox Code Playgroud)

迭代(毫不奇怪)非常缓慢.我猜Python有检查ba[i],在每次迭代(〜30万次!),和它的迭代60万次.现在已经花了一个多小时还没有完成,所以我知道我应该优化一些东西.

我的问题是:执行此交叉引用的最Pythonic或最快的方法是什么?

mha*_*wke 9

你可以使用套装:

c = set(b).intersection(a)
Run Code Online (Sandbox Code Playgroud)

我选择转换b为一个集合,因为它是两个列表中较短的一个.使用intersection()不要求a首先将列表转换为集合.

你也可以这样做:

c = set(a) & set(b)
Run Code Online (Sandbox Code Playgroud)

但是,两个列表都需要先转换为类型set.

无论哪种方式,您都有O(n)操作,请参阅时间复杂度.