【问题标题】:Fastest way to find the common item between two lists in Python在 Python 中查找两个列表之间公共项的最快方法
【发布时间】:2020-10-24 12:20:54
【问题描述】:

我正在寻找在 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

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

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

【问题讨论】:

  • 你的算法运行时间是 O(len(l))。仅遍历列表需要相同的运行时间 - 因此您无法改进它。

标签: python performance


【解决方案1】:

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

例子:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    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
    

    【讨论】:

    • 感谢您的回答。但是关于我只获得第一个共同元素的事实,是因为我忘了提到最多有一个共同项目。
    • 如果这对您有帮助,那么您可以接受我的帖子作为答案。
    猜你喜欢
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多