【问题标题】:How to remove an item from a list if its in one or two (or N) other lists如果项目在一个或两个(或 N)其他列表中,如何从列表中删除它
【发布时间】:2016-10-18 10:32:30
【问题描述】:

我有一个名为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 列表推导的文档中明确找到答案。

【问题讨论】:

    标签: python list-comprehension


    【解决方案1】:

    使用集合快速查找项目:

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

    随着从集合中删除重复项,整个搜索空间的大小也减小了。

    在 SO 上找到了这个 somewhere

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

    【讨论】:

    • 两个后续问题:1) 我是否需要将集合转换为列表(即 list(set(filter1+filter2)) 才能正常工作 2) 这种事情不会与 ValuesQuerySet 一起工作吗?
    • 强制查询集通过切片来评估它们的项目:set(filter1[:] + filter2[:])。您无需将set 转换为list
    【解决方案2】:

    你也可以使用:

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

    【讨论】:

    • 感谢 Nikign,和 Moses 一起做这个。
    【解决方案3】:

    我认为你可以这样做:

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

    我建议制作两个集合 filter1filter2object.pk 被过滤只是 bc 从集合中获取一个元素它更快

    【讨论】:

    • 我想你想使用and,而不是or
    • 感谢 Mahendra,同意 Moses 对此的回答,因为它有一些额外的优化。
    猜你喜欢
    • 2012-10-26
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 2021-11-15
    • 2013-02-07
    • 2021-05-02
    相关资源
    最近更新 更多