假设我有:
dict_listA = [
{'id':0, 'b':1},
{'id':1, 'b':2},
{'id':2, 'b':3},
]
以及
dict_listB = [
{'id':1, 'b':1},
{'id':2, 'b':3},
{'id':3, 'b':2},
]
我怎样才能得到一个id的列表,在这里我们有基于id的交集,但是基于b的对称差分?你知道吗
same_a_different_b = [
{'id':1, 'b':2},
]
目前这是我的解决方案:
for d1 in list_dictA:
same_a_different_b = filter(lambda d2: d2['id'] == d1['id'] and d2['b'] != d1['b'], list_dictB)
我问,因为这是目前最大的时间在我的计划,我希望有一些方法做得更快。结果(same_a_different_b
)通常是0或非常小,一个列表有大约900个条目,另一个大约1400个条目。目前需要9秒。你知道吗
试试这个:
我认为算法的复杂度等于O(len(a)+len(b))。 例如,在你的解中,它等于O(len(a)*len(b))。你知道吗
如果列表可以有重复项:
比较速度(len(a)==len(b)==2000):
结果:
下面是使用列表理解和
itertools.prodcut
的一种方法:但是请注意,如果在
dict_listB
中有多个匹配项,那么这将生成重复的结果。如果你不想保留所有的副本,你可以用集合理解代替。你知道吗相关问题 更多 >
编程相关推荐