我有两个大名单:
a = [['abcdefghijklmno', 'foo', 'bar'], … ]
b = [['abcdefghij12345', 'foo', 'bar'], … ]
我对a
中b
中没有相应条目的所有成员感兴趣,反之亦然,基于比较a[n][0]
和b[n][0]
a
和b
中的所有 n 。我创建了两组这些子列表项,这使我可以set_a.difference(set_b)
,反之亦然,这非常快。但是,基于a
和b
中剩余项目创建两个列表(可能显然)较慢:
def remaining(ls ,y, z):
return [i for i in ls if i[0] in y.difference(z)]
其中ls
为a
或b
,而y
和z
是上面详述的两个集合。重新考虑a
和b
的结构是否有任何意义可以加快速度(例如,使用带有a[0]
和b[0]
值的词组作为键?
答案 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)
完成任务并解决问题。