我的问题是关于从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或者自动化程序,但是有什么方法可以更好地完成这项工作吗?
谢谢
答案 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。