2017-05-04 61 views
-2
list_1 = [[1, 2, 3], [100, 13, 17], [5, 14, 29], [17, 55, 1000]] 

list_2 = [1, 100] 

返回列表應包含的list_1子表上提取子列表,如果從list_2存在於list_1我有Python列表中的列表。我想以另一種新的列表

子列表ATLEAST一個元素尋找類似的結果[[1, 2, 3], [100, 13, 17] ]

如果list_2 = [5, 13, 17, 55]

[[100, 13, 17], [5, 14, 29],[17, 55, 1000]] 

如果list_2 = [29]

[[5, 14, 29]] 

我正在尋找一種最快的方式來實現這一目標,因爲大部分時間,我的list_1的長度超過500萬。

是否有任何網絡庫函數來實現這個功能?

回答

2

這將是一個辦法做到這一點:

list_3 = [x for x in list_1 if any(y in x for y in list_2)] 

「神奇」發生在其中循環,雖然的list_2和檢查的元素,使子列表中他們確保至少有一個存在any那傳遞給list_3

如果你想要更多的東西整潔你可以用下面去:

list_1 = [[1,2,3], [100,13,17], [5,14,29],[17,55,1000]] 


def get_new_list(list_from, list_criteria): 
    # if the list holding the "criteria" is big (has to be tested and calibrated), converting it to a set will speed things up. 
    if len(list_criteria) > 50: 
     list_criteria = set(list_criteria) 
    return [x for x in list_from if any(y in x for y in list_criteria)] 

list_2 = [1,100] 
print(get_new_list(list_1, list_2)) # [[1, 2, 3], [100, 13, 17]] 

list_2 = [5,13,17,55] 
print(get_new_list(list_1, list_2)) # [[100, 13, 17], [5, 14, 29], [17, 55, 1000]] 

list_2 = [29] 
print(get_new_list(list_1, list_2)) # [[5, 14, 29]] 

正如你所看到的,不需要外部庫或其他任何東西。所有標準的Python都很好。

+0

重複掃描list_2以測試成員身份可能比構建一個包含list_2的所有元素一次的集合並檢查集合中的成員資格:許多比較,嚴重縮放list_2大小而不是單個哈希查找。 –

+0

@LorenzoGatti如果'list_2'有很多*元素*轉換爲set **確實有意義。否則,我的眼中沒有任何好處。 *重複*位我不明白tbh。 –

+0

對於需要測試list_2成員資格的list_1元素的每個元素,將從頭開始掃描list_2。工作與list_1和list_2的元素數量的乘積成比例,而不是list_1的元素數量。 –

相關問題