更有效的方法从大型数据集中删除项目

时间:2011-08-13 20:42:22

标签: python

我有两个大名单:

a = [['abcdefghijklmno', 'foo', 'bar'], … ]
b = [['abcdefghij12345', 'foo', 'bar'], … ]

我对ab中没有相应条目的所有成员感兴趣,反之亦然,基于比较a[n][0]b[n][0] ab中的所有 n 。我创建了两组这些子列表项,这使我可以set_a.difference(set_b),反之亦然,这非常快。但是,基于ab中剩余项目创建两个列表(可能显然)较慢:

def remaining(ls ,y, z):
    return [i for i in ls if i[0] in y.difference(z)]

其中lsab,而yz是上面详述的两个集合。重新考虑ab的结构是否有任何意义可以加快速度(例如,使用带有a[0]b[0]值的词组作为键?

2 个答案:

答案 0 :(得分:2)

我怀疑你在列表解析中的测试是为每个元素调用y.difference。试试这个:

def remaining(ls, y, z):
    diff = y.difference(z)
    return filter(lambda i: i[0] in diff, ls)

答案 1 :(得分:1)

至少def remaining(ls ,y, z):应该在def remaining(ls, common_set):中重写。

考虑下一个想法:在对象中包裹['abcdefghijklmno', 'foo', 'bar'](可能包含__slots__)并仅使用__hash__值定义其'abcdefghijklmno'。之后,您将能够set(a) - set(b)完成任务并解决问题。