在Python中检查另一个列表中列表位置的最有效方法

时间:2017-04-06 22:03:54

标签: python performance list

这不是关于如何做的问题,而是关于如何更有效地做到这一点的问题。我有2个列表,一个superList,它包含subList中的所有元素和更多的元素。让我们举例如下:

a = [0,1,2,3,4,5,6,7,8,9] # a is my superList
b = [2,3,5,7] # b is my subList

我想以某种方式检查b中哪些b元素存在,并且回答如下:

[0, 0, 1, 1, 0, 1, 0, 1, 0, 0]

我这里有这个代码,它可以很好地用于短列表和少量的ob子列表,但是一旦数据大小开始增加就会效率低下。哪种解决方案比下面的解决方案更有效。请记住,我想运行此代码,以便对longList中的shortList进行大量检查。它是嵌套在for a情境中的:

def isInList(longList, shortList):
    indexList = []
    for i in range(len(longList)):
        if longList[i] in shortList:
            indexList.append(1)
        else:
            indexList.append(0)
    return indexList

2 个答案:

答案 0 :(得分:4)

列表理解在Python中非常有效。检查O(n)的快捷方法是:

[1*(aa in b) for aa in a]
# returns:
[0, 0, 1, 1, 0, 1, 0, 1, 0, 0]

更高效的是将b转换为集合,因为检查集合中的存在是否为O(1)。

b_set = set(b)
[1*(aa in b_set) for aa in a]
# return:
[0, 0, 1, 1, 0, 1, 0, 1, 0, 0]

答案 1 :(得分:0)

另一种方法是:

[1 if _ in b else 0 for _ in a]