2017-04-06 76 views
0

這不是關於如何做的問題,而是關於如何更有效地做到這一點的問題。我有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

如何列表解析? –

回答

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

如果不清楚乘以1的效果是什麼,它會將bool轉換爲int。你也可以在進一步的測試中做int(aa in b)'(對於OP) – acushner

+1

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

0

可以去另一種方法是:

[1 if _ in b else 0 for _ in a] 
相關問題