Jeśli chcesz rozwiązanie jedno-liner (pomijając importu), które wymaga jedynie O(max(n, m))
pracy dla wejść o długości n
i m
, nie O(n * m)
pracy, można to zrobić z the itertools
module:
from itertools import filterfalse
main_list = list(filterfalse(set(list_1).__contains__, list_2))
ta korzysta z funkcji czynnościowych zachodzących funkcji zwrotnej konstruktem jon, pozwalając mu utworzyć wywołanie jednorazowe i użyć go ponownie dla każdego elementu bez potrzeby przechowywania go gdzieś (ponieważ filterfalse
przechowuje go wewnętrznie); Zrozumienie listy i wyrażeń generatora może to zrobić, ale jest brzydkie.†
że dostaje takie same wyniki w jednej linii jak:
main_list = [x for x in list_2 if x not in list_1]
z prędkością:
set_1 = set(list_1)
main_list = [x for x in list_2 if x not in set_1]
oczywiście, jeśli porównania mają być pozycyjny, więc:
list_1 = [1, 2, 3]
list_2 = [2, 3, 4]
powinna produkować:
main_list = [2, 3, 4]
(ponieważ wartość w list_2
ma mecz w tym samym indeksem w list_1
), powinno się iść z Patrick's answer, która nie pociąga za sobą tymczasowe list
s lub set
s (nawet set
s jest z grubsza O(1)
, mają wyższy "stały" czynnik na czeku niż proste kontrole równości) i obejmuje pracę O(min(n, m))
, mniej niż jakakolwiek inna odpowiedź, a jeśli twój problem jest wrażliwy na pozycję, jest jedynym rozwiązaniem, gdy dopasowanie elementów pojawia się w niedopasowanych przesunięciach.
†: Sposobem na to samo z listowego jako jedną wkładką będzie nadużywać zagnieżdżone pętle, aby utworzyć i wartość cache (y) w „peryferyjnymi” pętli, np:
main_list = [x for set_1 in (set(list_1),) for x in list_2 if x not in set_1]
, która również daje niewielką poprawę wydajności w Pythonie 3 (ponieważ teraz set_1
jest lokalnie zawarty w kodzie zrozumienia, a nie podniósł się z zagnieżdżonego zakresu dla każdego sprawdzenia, w Pythonie 2, który nie ma znaczenia, ponieważ Python 2 nie używać zamknięć do sprawdzania list, działają w tym samym zakresie, w którym są używane).
szukasz elementów 'list_2' które pojawiają się znikąd w' list_1' lub elementów w 'list_2', które nie są obecne w tym samym indeksie w' list_1'? –