检查python列表的最佳和有效方法

时间:2012-08-21 04:27:07

标签: python performance

上周我在接受采访时被问到这个问题,但我没有得到答案(无论如何都是正确答案)。比如你有一个列表A,其中包含以下元素[1,3,5,7,9,10]然后你有列表B,它有以下元素:[3,4,5,6,7],并且您想知道列表B中哪些元素在列表A中。我的答案是:

for item in listA:
    for item1 in listB:
        if item1 == item:
            put item1 in some third list

但我知道这很糟糕,因为说listA是一百万个元素,而listB是十万个,这个解决方案只是垃圾。

没有两个列表的迭代,实现这样的事情的最佳方法是什么?

5 个答案:

答案 0 :(得分:6)

set(listA) & set(listB)最简单。

答案 1 :(得分:2)

我建议将它们转换为集合并进行交叉:

setA = set(listA)
setB = set(listB)
setA.intersection(setB)

编辑:请注意,这将删除两个列表中的所有重复元素。因此,如果我们有listA = [1,1,2,2,3]listB = [1,1,2,3],那么交集将只是set([1,2,3])。此外,对于最坏情况估计,这将与列表理解一样慢O(n * m),其中n和m是列表的相应长度。然而,平均情况要好得多O(n) + O(m) + O(min(m,n)) == O(max(m,n))

答案 2 :(得分:1)

使用list comprehension并使用in运算符测试成员资格:

[i for i in lista if i in listb]

会产生:

[3, 5, 7]

或者,可以使用set操作并查看两个列表(转换为集合)的交集是什么。

答案 3 :(得分:1)

好吧我也可以在混音中输入过滤器

filter(lambda x: x in listb,lista)

答案 4 :(得分:0)

您可以使用套装(首选):

listC = list(set(listA) & set(listB))

或列表理解:

listC = [i for i in listA if i in listB]