繁体   English   中英

有效地查找两个列表之间的元素差异

[英]Finding an element difference between two lists efficiently

给定列表ab ,其中ab相比有一个额外的元素,我试图以一种有效的方式找到仅以a存在的额外元素。 虽然这可以使用set(a) ^ set(b)轻松完成,但问题是ab可能包含多个具有相同名称的元素,应该独立处理。

例如:

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()永远不会是最有效和优化的方法,尤其是在ab很大的情况下。 有没有一种有效的方法来定位额外的元素?

您可以使用排序在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM