如果项目在一个或两个(或N个)其他列表中,则如何从列表中删除该项目

时间:2016-06-16 18:46:49

标签: python list-comprehension

我有一个名为parent_list的父列表,以及两个子集,通过它我可以过滤parent_list。这些子集也是python列表,它们被称为filter1filter2

我可以这样做:

final_list = [object for object in parent_list if object.pk not in filter1 or filter2]

或者我是否需要单独进行此过滤,如:

intermediate_list = [object for object in parent_list if object.pk not in filter1]
final_list = [object for object in intermediate_list if object.pk not in filter2]

我无法从python list comprehensions的文档中明确找到答案。

3 个答案:

答案 0 :(得分:6)

使用集合快速查找项目:

final_list = [object for object in parent_list if object.pk not in set(filter1 + filter2)]
#                                                                   ^ 

当从集合中删除重复项目时,整个搜索空间的大小也会减少。

在SO上找到此somewhere

  

使用哈希表实现集合。每当你添加一个对象   一组,确定设置对象的存储器内的位置   使用要添加的对象的哈希值。在测试会员资格时,   所有需要做的就是查看对象是否在   位置由其哈希确定,因此此操作的速度确实如此   不依赖于集合的大小。对于列表,相反,整体而言   需要搜索列表,随着列表的增长,列表会变慢。

答案 1 :(得分:1)

我认为你可以这样做:

final_list = [object for object in parent_list if (object.pk not in filter1) and (object.pk not in filter2)]

我建议制作两组filter1filter2object.pk进行过滤,只需从一个集合中获取一个元素就可以更快

答案 2 :(得分:1)

您也可以使用:

final_list = [object for object in parent_list if object.pk not in filter1+filter2]