我在python列表中有列表。我想基于另一个新列表提取子列表

时间:2017-05-04 16:33:28

标签: python

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

list_2 = [1, 100]

如果来自list_1

子列表中list_2的至少一个元素,则返回列表应包含list_1的子列表

寻找类似于[[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万。

是否有任何网络库功能可以实现这一目标?

1 个答案:

答案 0 :(得分:2)

这是一种方法:

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

"魔法"发生在any中,它循环通过list_2的元素并检查以确保其中至少有一个存在于传递给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。