Удалить пересечение между двумя списками - PullRequest
1 голос
/ 17 февраля 2012

У меня есть два списка объектов:

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 ]

14 голосов
/ 01 мая 2013

, чтобы удалить пересечение между двумя списками, вы должны использовать 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])
2 голосов
/ 17 февраля 2012

Вы можете использовать набор и понимание списка, чтобы отфильтровать список:

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]
0 голосов
/ 17 февраля 2012

Использование remove:

some_list.remove(some_item)

См .: http://docs.python.org/tutorial/datastructures.html

Однако, если элемент не совпадает, он поднимет ValueError, поэтому, если вы не уверены, что элемент действительно находится в списке, поймайте ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...