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

问题描述:

这不是关于如何做的问题,而是关于如何更有效地做到这一点的问题。我有2个列表,一个包含来自子列表的所有元素和更多元素的superList。让我们在下面的列表,例如:检查Python中另一个列表中列表位置的最有效方法

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元素的存在,在某种程度上,我有一个列表,并回答诸如:

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

我有这样的代码这里对短列表和少量ob子列表做的工作很好,但是一旦数据大小开始增加,就会变得效率低下。哪种解决方案比下面的解决方案更有效。记住,我想运行这个代码,对longList中的shortList进行大量的检查。这是一个嵌套在内部的情况:

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 
+0

性能是O(nm)的其中n是a的大小和M是B的大小。你可以得到一个O(n)的解决方案,如果你使短名单成为'set' –

+0

语法明智,你可以只为'我在longList:如果我在shortList:'等 – ryugie

+0

如何列表解析? –

列表理解在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

如果不清楚乘以1的效果是什么,它会将bool转换为int。你也可以在进一步的测试中做int(aa in b)'(对于OP) – acushner

+1

,调用'int'比乘法要慢 – James

可以去另一种方法是:

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