#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.