Если вы хотите раствор один вкладыш (без учета импорта), что требует только O(max(n, m))
работы на входах длины n
и m
, не O(n * m)
работы, вы можете сделать это с the itertools
module:
from itertools import filterfalse
main_list = list(filterfalse(set(list_1).__contains__, list_2))
Это имеет преимущество функциональных функций, принимающих функцию обратного вызова по конструкции ion, позволяя ему создать обратный вызов один раз и повторно использовать его для каждого элемента без необходимости его хранить где-нибудь (потому что filterfalse
хранит его внутри); список понятий и выражений генератора может это сделать, но это уродливо.†
Это получает те же результаты в одной строке, как:
main_list = [x for x in list_2 if x not in list_1]
со скоростью:
set_1 = set(list_1)
main_list = [x for x in list_2 if x not in set_1]
Конечно, если сравнения предназначены позиционным, так:
list_1 = [1, 2, 3]
list_2 = [2, 3, 4]
следует производить:
main_list = [2, 3, 4]
(поскольку значение в list_2
имеет матч в тот же индекс в list_1
), вы должны обязательно идти с Patrick's answer, который не включает в себя никаких временных list
с или set
с (даже с set
s быть примерно O(1)
, они имеют более высокий «постоянный» коэффициент за проверку, чем простые проверки равенства) и включает в себя O(min(n, m))
, меньше, чем любой другой ответ, и если ваша проблема чувствительна к положению, является единственным правилом , когда соответствующие элементы появляются при несоответствующих смещениях.
†: Способ сделать то же самое со списком пониманием как однострочник будет злоупотреблять вложенное зацикливание для создания и значение кэша (s) в «внешней» петле, например:
main_list = [x for set_1 in (set(list_1),) for x in list_2 if x not in set_1]
, который также дает незначительное преимущество в производительности на Python 3 (потому что теперь set_1
локально ограничен кодом понимания, а не просматривается из вложенной области для каждой проверки; на Python 2 это не имеет значения, поскольку Python 2 не используйте закрытие для понимания списков, они работают в том же объеме, в котором они используются).
вы ищете элементы в 'list_2', которые не появляются нигде в' list_1' или элементах в 'list_2', которые отсутствуют в том же индексе в' list_1'? –