删除两个列表之间的交集

时间:2012-02-17 16:09:40

标签: python django

我有两个对象列表:

m2m_links = mymodel._meta.many_to_many
o2m_links = mymodel._meta.get_all_related_objects()

o2m_links中有一个我希望省略/删除的对象。它可以通过以下方式识别:

for r in m2m_links:
    if not r.rel.through._meta.auto_created:
        # Delete o2m_links object that has the same name as r.rel.through._meta.object_name

如何删除符合此循环命中条件的o2m_links对象?

3 个答案:

答案 0 :(得分:14)

要删除两个列表之间的交集,您应该使用set

a = set(range(10))
b = set(range(5,15))
a-b
>>set([0, 1, 2, 3, 4])
b-a
>>set([10, 11, 12, 13, 14])

答案 1 :(得分:2)

您可以使用集合和列表推导来过滤列表:

names_to_remove = set([r.rel.through._meta.object_name for r in m2m_links if not r.rel.through._meta.auto_created])
filtered_list = [r for r in o2m_links if r.rel.through._meta.object_name in names_to_remove]

答案 2 :(得分:0)

使用remove

some_list.remove(some_item)

请参阅:http://docs.python.org/tutorial/datastructures.html

但是,如果该项目不匹配,则会引发ValueError,因此,除非您确定该项目实际位于列表中,否则请抓住错误。