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合作。