Получить различия двух списков, содержащих разные типы объектов, используя python

#python

#python

Вопрос:

У меня есть два списка: l1 = [obj1_1, obj1_2, obj1_3]

l2 = [obj2_1, obj2_2]

l1 имеет объекты типа obj1 , а l2 имеет объекты типа obj2

Я хочу получить разницу между этими объектами на основе параметра. Например, obj1 и obj2 иметь параметр с именем id_1 и id_2 соответственно. Я хочу получить объекты, l1 которые не находятся в l2 where, где мы сравниваем объекты, используя id_1 == id_2

Редактировать:

Я хочу сделать это как можно более эффективно, я знаю, что могу сократить l2 только до списка id_2 s и выполнить цикл for l1 и вернуть список obj1 in l1 , которых нет в списке сокращенных объектов.

Комментарии:

1. Извините, это не очень понятно. Я предлагаю привести некоторый пример кода, в котором вы создаете эти объекты, а затем какой результат вы ожидаете.

2. [item1 for item1 in l1 if item1.id_1 in [item2.id_2 for item2 in l2]] , это понимание вложенного списка создает список элементов id_2 всех объектов в list2 и для каждого элемента в l1 ищет, существует ли id_1 в этом списке.

3. Являются ли объекты изменяемыми или неизменяемыми?

4. @Steffo они изменчивы

5. Возможно, вы можете сравнить __dict__ содержимое объектов …?

Ответ №1:

Шаг 1, создайте словарь l2 , в котором идентификатор является ключом:

 d2 = { i.id_1 : i for i in l2 }
  

Это лучше, чем цикл по спискам, как поиск в словарях O(1) .

Шаг 2, выполните цикл, l1 сохраняя те, которых нет l2 .

 ldiff = [i for i in l1 if i.id_1 not in d2]
  

Комментарии:

1. Вы никогда не используете значения dict — почему бы просто не сделать его a set ?

2. Да, согласен, лучше с set.