2017-05-04 33 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的元素数量。 –

相关问题