[英]Finding an element difference between two lists efficiently
给定列表a
和b
,其中a
与b
相比有一个额外的元素,我试图以一种有效的方式找到仅以a
存在的额外元素。 虽然这可以使用set(a) ^ set(b)
轻松完成,但问题是a
和b
可能包含多个具有相同名称的元素,应该独立处理。
例如:
a = ['Orange', 'Orange', 'Apple', 'Tomato', 'Orange', 'Watermelon']
b = ['Watermelon', 'Orange', 'Tomato', 'Orange', 'Apple']
结果应返回列表a
中的额外'Orange'
。 我的代码是:
def ListDiff(a, b):
for element in a:
if element in b:
b.remove(element)
else:
solution = element
return solution
但显然使用remove()
永远不会是最有效和优化的方法,尤其是在a
和b
很大的情况下。 有没有一种有效的方法来定位额外的元素?
您可以使用排序在O(n log(n))
时间内完成。 排序后,你可以做一个线性遍历来找到第一个差异。 重复元素使二分搜索复杂化,否则这是可能的。
def ldiff(a, b):
a.sort()
b.sort()
for i, j in zip(a, b):
if i != j:
break
else:
i, j = a[-1], b[-1]
return i if len(a) > len(b) else j
如果你 object 对sort
方法进行的就地修改,请改用sorted
function。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.