Python 如果项目位于一个或两个(或N个)其他列表中,如何从列表中删除项目

Python 如果项目位于一个或两个(或N个)其他列表中,如何从列表中删除项目,python,list-comprehension,Python,List Comprehension,我有一个名为parent\u list的父列表,以及两个子集,通过它们我可以过滤parent\u列表。这些子集也是python列表,它们被称为filter1和filter2 我可以做: final_list = [object for object in parent_list if object.pk not in filter1 or filter2] 或者我需要单独进行过滤,如: intermediate_list = [object for object in parent_list

我有一个名为
parent\u list
的父列表,以及两个子集,通过它们我可以过滤
parent\u列表
。这些子集也是python列表,它们被称为
filter1
filter2

我可以做:

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列表理解的文档中明确找到答案。

我认为您可以按如下方式进行操作:

final_list = [object for object in parent_list if (object.pk not in filter1) and (object.pk not in filter2)]
我建议使用
对象制作两个集
filter1
filter2
。pk
只需从一个集中获取一个元素即可进行过滤,速度更快

您还可以使用:

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

使用集合快速查找项目:

final_list = [object for object in parent_list if object.pk not in set(filter1 + filter2)]
#                                                                   ^ 
当从集合中删除重复项时,整个搜索空间的大小也会减小

我在上面找到了这个:

集合是使用哈希表实现的。无论何时将对象添加到 在集合中,集合对象在内存中的位置是确定的 使用要添加的对象的哈希。在测试会员资格时, 所有需要做的基本上是看对象是否在 位置由其哈希值确定,因此此操作的速度 不取决于集合的大小。相反,对于列表,整个 需要搜索列表,随着列表的增长,搜索速度会变慢


我想你应该使用
,而不是
。谢谢Mahendra,同意Moses的回答,因为它有一些额外的优化。下面两个问题:1)我是否需要将集合转换为列表(即列表(集合(filter1+filter2))才能工作2)这种事情对ValuesQuerySet不起作用,是吗?强制查询集通过切片来计算其项:
set(filter1[:]+filter2[:])
。您不需要将
集合
转换为
列表
。感谢Nikign,在这一点上与Moses合作。