更好的方法来提取包含列表B中的ID的列表A的项目?

时间:2018-04-09 10:14:10

标签: python algorithm

我的问题是关于从2个共享相同ID的实例列表中提取数据的算法。 这是一个例子: ClassA有2个属性:ID和info,classB有1个属性:ID

listA         listB
instanceA1    instanceB1
instanceA2    instanceB2
instanceA3
instanceA4

我做的很简单

IDs_listB = [l.ID for l in listB]  
out_tab=[] 
for line in listA:
        if line.ID in IDs_listB:
            out_tab.append(line)

但是对于大数据来说,这种方式变得非常缓慢和沉重,如果listA有N行而M行为listB,则O(N * M)总复杂度太高...... ..

我正在考虑使用cython或者自动化程序,但是有什么方法可以更好地完成这项工作吗?

谢谢

3 个答案:

答案 0 :(得分:0)

与list相比,您可以使用set而不是ListB作为set使用散列并使用in关键字更快。

创建一个ListB字典,并使用ID作为键,True作为值,并像这样搜索。

for line in listA: if dictB.get(line.ID): extract(line)

答案 1 :(得分:0)

你可以像这样使用Counter(O(n + m))

from collections import Counter
lst1 = ["1","2","3"]
lst2 = ["1","3","4"]

c = Counter(lst1 + lst2)
print [i for i in c if c[i] > 1]

输出

['1', '3']

答案 2 :(得分:0)

使用Sets,您可以将时间复杂度提高到O(n)平均值,O(m*n),最差情况下,列表大小 n m

l1 = [1,2,3]
l2 = [2,4,6]
s = set(l1)
l3 = [i for i in l2 if i in s]
print(l3) // [2]

在集合中查找的平均时间复杂度为O(1),其中 Worst Case 中的O(N)达到new。参考Complexity of *in* operator in python