在Python中查找两个列表之间的公共项目的最快方法

时间:2020-07-03 18:43:13

标签: python performance

我正在寻找最快的方法来查找Python中两个列表之间的公共项目。这些列表的长度相同,包含整数(至少10k),并且是无序的。搜索了一段时间后,我找到了此解决方案:

def common_item(l1, l2):
    s = None
    l2 = set(l2)
    for i in l1:
        if i in l2:
            s = i
            break

    return s

我的目标(如果可能)是改进代码。欢迎任何建议。

编辑:我忘了提到最多有一个共同点。

2 个答案:

答案 0 :(得分:1)

这是非常低效的,并且它仅获取两个列表中的第一个公共项目,而不是全部,因此,更好的紧凑型解决方案是使用集合。 像这样

def common_item(l1, l2):
    return list(set(l1).intersection(set(l2)))

OR

def common_item(l1, l2):
    return list(set(l1) & set(l2))

,如果所有元素都是唯一的,则应该返回两个列表中所有共同元素的列表。

如果列表中有重复的元素,则可以尝试这种方法,如果遇到列表中的元素,则会从列表中删除该元素,但会增加运行时间,而当元素变小时,这是微不足道的。

def common_item(l1, l2):
    res = []
    for x in l1:
        if x in l2:
            res.append(x)
            l2.remove(x)
    return res

答案 1 :(得分:-1)

您可以在this link上找到解决该问题的Python方法。

示例:

a = set([1, 2, 3])
b = set([2, 3, 4])
print(a & b)

请注意如何使用&运算符表示集合相交。

可以找到here的集合交点的时间复杂度答案

这是集合大小的线性关系,但是您还必须将列表转换为集合。但是,由于它们是哈希表,因此也是线性的。 another answer here